Отрицательное регулярное выражение без пробелов между ними - PullRequest
1 голос
/ 18 апреля 2019

Регулярное выражение ниже соответствует всем трем нижеприведенным примерам.

(?!\d+)(bn)

325bn
325 bn
424bn

Я хочу соответствовать только

325bn
424bn

Более конкретно, я хочу соответствовать только bn передцифры

Ответы [ 4 ]

3 голосов
/ 18 апреля 2019

Почему ваше регулярное выражение неверно

Ваше регулярное выражение будет соответствовать любому bn, несмотря ни на что. Поскольку заголовок находится перед (bn), он всегда будет иметь значение true (благодаря @ WiktorStribiżew).

Однако даже в правильном положении (bn)(?!\d+) будет соответствовать любому bn, за которым не следуют цифры (positive/negative lookarounds). Таким образом, все они будут сопоставлены:

sj bn bn bn bn bn
somethingbn

Это не то, что вы хотите.

Решение

Насколько я понимаю, вам нужно совпадать только с bn, который ставится после нескольких цифр. Почему бы вам просто не пойти с:

\d+(bn)

выход

325bn ---> Match
325 bn
424bn ---> Match

sj bn bn bn bn bn
somethingbn

Демо

Решение с позитивным взглядом

Как уже упоминалось @revo, было бы полезно иметь решение, использующее lookaround, чтобы иметь представление о том, как оно работает.

(?<=\d)bn

Это positive lookbehind. Это говорит механизму регулярных выражений временно отступить назад в строке, чтобы проверить, может ли текст внутри взгляда быть сопоставленным там .

0 голосов
/ 18 апреля 2019

Точнее, я хочу соответствовать только bn перед цифрами

Порядок имеет значение, и тогда он должен быть положительным с нетерпением.

(bn)(?=\d+)

Демо

0 голосов
/ 18 апреля 2019

Ваш шаблон (?!\d+)(bn) читается как утверждают, что прямо справа не 1 + цифры.Что будет верно, потому что за ним следует bn

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

\b\d+(bn)\b

Regex demo

Если перед началом строки должно стоять либо начало строки, либо символ пробела (?:\s|^), а за ним может следовать только не символ без пробела (?!\S), вы можете использовать:

(?:\s|^)\d+(bn)(?!\S)

Regex demo

0 голосов
/ 18 апреля 2019

С вашими выборочными данными и ожидаемыми совпадениями вы, похоже, действительно хотели использовать позитивный взгляд позади, но в итоге вы неправильно использовали негативный взгляд вперед. Кроме того, квантифицированные \d+ сторонние выражения поддерживаются редко (поддерживаются в .NET).

Как вы писали, вы более конкретно хотели соответствовать только bn, которому предшествует цифра, вы можете изменить свое регулярное выражение на это,

(?<=\d)bn\b

Это обеспечивает совпадение bn, если ему предшествует цифра, а \b гарантирует, что bn не соответствует большему слову, начинающемуся с bn

Regex Demo

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