Учитывая строку как
Некоторый текст и [A ~ Token] и еще текст и [не токен] и
[Другой ~ лексема]
Мне нужно извлечь "жетоны" для последующей замены. Токены определены как два идентификатора, разделенных символом ~ и заключенных в []. Я использовал $string -match "\[.*?~.*?\]"
, который работает. И, насколько я понимаю, я убираю обе скобки, выполняя любой символ ноль или более раз и вынужденный ленивый, затем ~ и затем ту же самую последовательность символов. Итак, моим первым улучшением было заменить .*?
на .+?
, так как я хочу 1 или больше, а не ноль или больше. Затем я перешел на $string -match "\[[A-Za-z0-9]+~[A-Za-z0-9]+\]"
, который ограничивает два идентификатора буквенными цифрами, что является большим улучшением.
Итак, первый вопрос:
Является ли это последнее решение лучшим подходом, или есть дальнейшие улучшения?
Кроме того, в настоящее время я получаю только один возвращенный токен, поэтому я перебираю строку, заменяю токены по мере их обнаружения и зацикливаюсь до тех пор, пока токенов не будет. Но, насколько я понимаю, по умолчанию RegEx является жадным, и поэтому я ожидал, что эта последняя версия выдаст два токена, и я мог бы циклически проходить по словарю, а не использовать цикл While.
Итак, второй вопрос:
Что я делаю не так, что получаю только один матч назад? Или я неправильно понимаю, как работает жадное сопоставление?
EDIT:
чтобы уточнить, я использую $ match, как показано здесь, и все еще получаю счет только 1.
if ($string -match "\[[A-Za-z0-9]+~[A-Za-z0-9]+\]") {
Write-Host "new2: $($matches.count)"
foreach ($key in $matches.keys) {
Write-Host "$($matches.$key)"
}
}
Кроме того, я не могу использовать прямую замену в момент идентификации токена, потому что существует ТОНА потенциальных замен. Я беру токен, обрезаю квадратные скобки, затем разделяю на ~, чтобы получить значения префикса и суффикса, которые затем идентифицируют конкретное значение замены, которое я могу сделать с выделенным -relace.
И последнее уточнение: количество токенов является переменным. Это может быть только один, это может быть три или четыре. Поэтому мое решение должно быть довольно гибким.