#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)