Можно ограничить область видимости - PullRequest
0 голосов
/ 08 ноября 2019

Мы можем проверить, есть ли цифра в пароле, например, выполнив что-то вроде:

(?=.*\d)

Или есть цифра и строчные буквы с:

(?=.*\d)(?=.*[a-z])

Это в основном будет продолжаться "до конца", чтобы проверить, есть ли буква в строке.

Однако мне было интересно, возможно ли каким-то общим способом ограничить область просмотра. Вот основной пример, который, я надеюсь, продемонстрирует эту точку:

start_of_string;
middle_of_string;
end_of_string;

Я хочу использовать одно регулярное выражение для сопоставления с start_of_string + middle_of_string + end_of_string.

Можно ли использовать заглядывание / взгляд назад в разделе middle_of_string БЕЗ ЗНАНИЯ, ЧТО ПРОИЗОЙДЕТ ДО ИЛИ ПОСЛЕ ЭТОГО ? То есть, не зная размера или содержимого предыдущего / последующего строкового компонента. И ограничить область просмотра только тем, что содержится в этой части строки?

Давайте рассмотрим один пример:

start_of_string = 'start'
middle_of_string = '123'
end_of_string = 'ABC' 

Можно ли проверить содержимое каждой части? но ограничить ли его область действия следующим образом?

string = 'start123ABC'
# Check to make sure the first part has a letter, the second part has a number and the third part has a capital


((?=.*[a-z]).*) # limit scope to the first part only!!
((?=.*[0-9]).*) # limit scope to only the second part.
((?=.*[A-Z]).*) # limit scope to only the last part.

Другими словами, могут ли «оглядываться назад» или «оглядываться назад» быть «прикованными» другими компонентами регулярного выражения, если оно не испортит все регулярное выражение?

ОБНОВЛЕНИЕ :

Вот пример, надеюсь, это более полезно для вопроса:

START_OF_STRING = 'abc'

Существует ли в нем 'x'? (?=.*x) ==> False

END_OF_STRING = 'cdxoy'

Есть ли в нем 'y'? (?=.*y) ==> True

FULL_STRING = START_OF_STRING + END_OF_STRING
'abcdxoy'

Возможно ли связать два регулярных выражения любым способом, чтобы работать только с компонентом 'подстроки'? Например, теперь (?=.*x) в первой части строки вернет True, но не должно.

`((?=.*x)(?=.*y)).*`

Я думаю, что краткий ответ на это "Нет, это невозможно.", НоЯ надеюсь услышать от кого-то, кто понимает это, чтобы сказать, почему это так.

1 Ответ

0 голосов
/ 08 ноября 2019

В .NET и javascript вы можете использовать положительный прогноз в начале вашего строкового компонента и отрицательный взгляд в конце, чтобы «ограничить» совпадение. Пример:

.*(?=.*arrow)(?<middle>.*)(?<=.*arrow).*
helloarrowxyz
{'middle': 'arrow'}

Если в pcre, python или другом вам понадобится либо предугадать фиксированную ширину, чтобы ограничить его от слишком большого продвижения вперед, например, как сказал выше Wiktor Stribiżew:

.*(?=.{0,5}arrow)(?<middle>.{0,5}).* 

В противном случае было бы невозможно обойтись без предварительного просмотра фиксированной ширины или предварительного просмотра с переменной шириной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...