Powershell: извлеките mediaid из строки

#powershell #powershell-2.0 #powershell-3.0 #powershell-4.0

Вопрос:

Я хочу извлечь mediaid из строки

 "u003cimage mediaid="{2EB3AFF5-24C6-4C1F-8957-37CBFCBED751}" alt="Caulfield to Dandenong Level Crossing Removal" height="" width="" hspace="" vspace="" /u003e",
 

Как это можно сделать?

Комментарии:

1. Почему вы отметили это всеми версиями PowerShell? Какую версию вы на самом деле используете?

2. @Theo Я использую версию 4

Ответ №1:

Из-за отсутствия требований в опубликованном вопросе может потребоваться какое-то регулярное выражение:

Чтобы извлечь mediaid в этом случае или любое имя идентификатора, стоящее перед указанным идентификатором GUID, вы можете сделать следующее:

 $str = '"u003cimage mediaid="{2EB3AFF5-24C6-4C1F-8957-37CBFCBED751}" alt="Caulfield to Dandenong Level Crossing Removal" height="" width="" hspace="" vspace="" /u003e",'
$regex = [regex]'S (?==\"{[-A-F0-9] }\")'
$regex.Match($str).Value
 

Чтобы извлечь значение mediaid , вы можете сделать следующее:

 $str = '"u003cimage mediaid="{2EB3AFF5-24C6-4C1F-8957-37CBFCBED751}" alt="Caulfield to Dandenong Level Crossing Removal" height="" width="" hspace="" vspace="" /u003e",'
$regex = [regex]'(?<=mediaid=)S '
$regex.Match($str).Value
 

Объяснение:

  • S : Соответствует символу без пробела один или несколько раз ( )
  • (?=<something>) : Позитивный взгляд на <something> персонажей, но не отражает их
  • (?<=) : Positive lookbehind for ` но не захватывает
  • [A-F0-9-] : Соответствие классу символов , которое включает в себя верхний регистр A F , от нуля до девяти и - (тире). Обратите внимание, что здесь используется верхний регистр, потому что мы используем .ЧИСТЫЙ класс Regex . Как правило, Windows PowerShell не учитывает регистр без указания иного, например $str -match '[A-F]' , будет соответствовать a-f или A-F .

Ответ №2:

Вы можете использовать Substring функцию. Синтаксис таков: .Substring( StartIndex [, length] )

 $string= 'u003cimage mediaid="{2EB3AFF5-24C6-4C1F-8957-37CBFCBED751}" alt="Caulfield to Dandenong Level Crossing Removal" height="" width="" hspace="" vspace="" /u003e'
$mediaid = $string.Substring($string.Length - 148, 36)
 

Ответ №3:

Одним из вариантов является использование регулярных выражений:

 $text = '"u003cimage mediaid="{2EB3AFF5-24C6-4C1F-8957-37CBFCBED751}" alt="Caulfield to Dandenong Level Crossing Removal" height="" width="" hspace="" vspace="" /u003e"'

[Regex]::Match($text, '(?<={).*(?=})').Value
 

Который возвращает:

2EB3AFF5-24C6-4C1F-8957-37CBFCBED751

Ответ №4:

Вы также можете использовать оператор регулярного -replace выражения для этого, где вы просто фиксируете то, что хотите сохранить, и удаляете все остальное:

 $string= 'u003cimage mediaid="{2EB3AFF5-24C6-4C1F-8957-37CBFCBED751}" alt="Caulfield to Dandenong Level Crossing Removal" height="" width="" hspace="" vspace="" /u003e'
$string -replace '.*mediaid=\?"({[0-9A-F-] }).*', '$1'
 

Результат:

 {2EB3AFF5-24C6-4C1F-8957-37CBFCBED751}
 

Сведения о регулярном выражении:

 .                    Match any single character that is not a line break character
   *                 Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
mediaid=             Match the characters “mediaid=” literally
\                   Match the character “” literally
   ?                 Between zero and one times, as many times as possible, giving back as needed (greedy)
"                    Match the character “"” literally
(                    Match the regular expression below and capture its match into backreference number 1
   {                 Match the character “{” literally
   [0-9A-F-]         Match a single character present in the list below
                     A character in the range between “0” and “9”
                     A character in the range between “A” and “F”
                     The character “-”
                     Between one and unlimited times, as many times as possible, giving back as needed (greedy)
   }                 Match the character “}” literally
)
.                    Match any single character that is not a line break character
   *                 Between zero and unlimited times, as many times as possible, giving back as needed (greedy)