Шаблон регулярного выражения для соответствия всем и возврата нуля при обнаружении определенных слов

У меня есть это выражение Regex. ^BRN.*?(?:paid|to)\s([A-Za-z\s]+)\b(?<!\bself)

Я хочу, чтобы он возвращал слова после требуемого шаблона, но только некоторые слова не найдены. Если они найдены, регулярное выражение ничего не должно возвращать. Таким образом,

BRN CLG-CI IQ PAID ИОНАНДА ПОЛ

должен вернуть IONANDA PAUL, что он и делает. Так что там правильно. Но я хочу

BRN-TO CASH САМОСТОЯТЕЛЬНО

чтобы вернуть нулевую строку или, по существу, она соответствует, но не возвращает никакого вывода. В настоящее время регулярное выражение возвращает это CASH\s, \s означает, что в вывод включены пробелы. Я пробовал отрицательный взгляд назад, но я все еще ищу, как просто ничего не возвращать, если слово найдено. Спасибо!


person rick458    schedule 02.06.2021    source источник
comment
Заметка, но если у вас есть совпадение без учета регистра, вы можете исключить A-Z из класса символов (или, если это платное обновление с учетом регистра, и в символы верхнего регистра, поскольку это то, что показывают ваши образцы).   -  person JvdV    schedule 02.06.2021
comment
Ах да, это нечувствительно к регистру. Я определенно могу отпустить их, я думаю, это просто вошло в привычку. Спасибо за чаевые!   -  person rick458    schedule 02.06.2021


Ответы (1)


Обратите внимание, что ваше регулярное выражение захватывает CASH в BRN-TO CASH SELF с ([A-Za-z\s]+)\b, потому что как только граница слова достигается после SELF , отрицательный просмотр назад запускает поиск с возвратом, а механизм регулярных выражений повторно сопоставляет строку и начинает выдавать символ за символом, делая шаг назад по строке, чтобы в конечном итоге найти положение границы слова прямо перед SELF, где нет SELF, так как целое слово присутствует сразу слева этого местоположения, и это действительное совпадение.

Вы можете использовать отрицательный просмотр после \s:

^BRN.*?(?:paid|to)\s(?![A-Za-z\s]*\bself\b)([A-Za-z\s]+)
#                   ^^^^^^^^^^^^^^^^^^^^^^^

См. демонстрацию регулярного выражения.

Теперь, сразу после совпадения с пробелом после paid или to, отрицательная проверка упреждения будет запущена один раз, и если есть целое слово self после любого нуля или более букв ASCII или символов пробела, все совпадение не будет выполнено, иначе оно будет преуспеть.

person Wiktor Stribiżew    schedule 02.06.2021
comment
О, теперь я понял, почему он все еще возвращает Cash после себя из-за возврата. И запускать проверку символов ASCII один раз до и после — это здорово! Определенно решает мою проблему, большое спасибо! - person rick458; 02.06.2021