Как я могу заставить это совпадение с регулярным выражением терпеть неудачу? - PullRequest
1 голос
/ 08 марта 2019

Я хочу регулярное выражение, соответствующее двузначному диапазону года и слову Caterpillar или Ford, например:

ABC123 08-10 Caterpillar

Но не так:

ABC123 fits 08-10 Caterpillar

или это:

ABC123 for 08-10 Caterpillar XYZ789

ABC123 и XYZ789 могут варьироваться и содержать что угодно.

Я пытаюсь заменить слово Caterpillar на fits Caterpillar, используя gsub, но я не хочу делать это на строках, которые уже содержат fits или for.Захваты важны, чтобы я мог понять, как сделать gsub.

. Я написал это:

/([^fits]\s?\d{2}-\d{2}\s*(Ford|Caterpillar))/

Но приведенное выше регулярное выражение соответствует всем трем моим примерным строкам.Так что мое слово отрицание не правильно.И диапазон года должен быть необязательным.Я хочу поместить это в квадратные скобки, но я не думаю, что я делаю это правильно, я думаю, что это обозначает диапазон.

Ответы [ 2 ]

2 голосов
/ 08 марта 2019

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

(?<!fits|for)(\b\s+\d\d-\d\d\s+)(Caterpillar|Ford)(?!.*\S)

Примечание: \b необходимо.

и для строки замены:

\1fits \2

Смотрите демо здесь

код рубина:

re = /(?<!fits|for)(\b\s+\d\d-\d\d\s+)(Caterpillar|Ford)(?!.*\S)/

str = 'ABC123 08-10 Caterpillar
ABC123 fits 08-10 Caterpillar
ABC123 for 08-10 Caterpillar XYZ789'

subst = '\\1fits \\2'

print str.gsub(re, subst)

Объяснение

Ваше текущее регулярное выражение содержит семантическую ошибку: [^fits] не означает fits, но означает символ , который не является ни f, i, t, ни s. Вам нужен обходной путь (lookahead / lookbehind), чтобы выразить отрицание строки символов .

Я использовал lookbeh для этого и отрицательный взгляд, чтобы проверить, не идет ли после пробела символ Caterpillar или Ford.

0 голосов
/ 08 марта 2019

Регулярное выражение, приведенное ниже, соответствует вашим требованиям, но вам придется выполнить замену

. Обратите внимание, что я использовал Negative Lookahead (?!), Чтобы исключить строки со строкой «подходит»

^(((?!fits).)*((\d{2}-\d{2}\s)Caterpillar))$

вы можете проверить это регулярное выражение здесь

...