Соответствует истине или ложи между строками - PullRequest
2 голосов
/ 27 февраля 2020

Я пытаюсь создать регулярное выражение, которое работает с оператором -match. Следующее уже работает:

# Exact match
$string1 = [Regex]::Escape('C:\Fruit\kiwi')
$regex = [regex] '^{0}$' -f $string1
'C:\Fruit\kiwi' -match $regex

# Match where trail is allowed ( -like 'c:\folder*')
$string1 = [Regex]::Escape('C:\Fruit\kiwi')
$regex = [regex] '^{0}' -f $string1
'C:\Fruit\kiwi\other folder' -match $regex

Теперь мы пытаемся найти совпадение, когда между двумя строками есть что-то, но это не получается:

# Match in between strings
$string1 = [Regex]::Escape("C:\Fruit")
$string2 = [Regex]::Escape("\kiwi")
$regex = [regex] '(?is)(?<=\b{0}\b)+?(?=\b{1}\b)' -f $string1, $string2
'C:\Fruit\d\kiwi' -match $regex

Согласно документам, в которых говорится :

  • '*' соответствует 0 или более раз
  • '+' соответствует 1 или более раз
  • '?' соответствует 1 или 0 раз
  • '*?' соответствует 0 или более раз, но как можно меньше
  • '+?' соответствует 1 или более раз, но как можно меньше

Так что я ожидал, что что-нибудь между C:\Fruit и \kiwi приведет к true, но это не так. Что мы делаем не так? Мы только после истинного ложного, потому что в конце мы склеим эти кусочки вместе, как regex1|regex2|...

1 Ответ

1 голос
/ 27 февраля 2020

Вы можете исправить свой текущий код, используя

$regex = [regex] "(?is)(?<=$string1).+?(?=$string2)"

Здесь

  • .+? используется, чтобы соответствовать любым 1+ символам как можно меньше, вам нужно количественно определить шаблон потребления, а не внешний вид
  • Используйте двойные кавычки для формирования строкового литерала для поддержки интерполяции строк. Также см. Дополнительные параметры в Как использовать переменную как часть регулярного выражения в PowerShell?
  • Вы должны удалить \b границы слов, так как они зависят от контекста (вы можете добавить любой дальнейшие ограничения позже при необходимости).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...