Regex - как совместить все, кроме определенного шаблона
Как написать регулярное выражение для соответствия любой строке, которая не соответствует определенному шаблону? Я столкнулся с ситуацией, когда мне нужно сопоставить шаблон (A и ~ B).
Ответы
Ответ 1
Вы можете использовать прогнозное утверждение:
(?!999)\d{3}
В этом примере отображаются три цифры, отличные от 999
.
Но если вам не нужна реализация регулярного выражения с этой функцией (см. Сравнение регулярных выражений), вам, вероятно, придется строить регулярное выражение с основными функциями по своему усмотрению.
Совместимое регулярное выражение с базовым синтаксисом:
[0-8]\d\d|\d[0-8]\d|\d\d[0-8]
Это также соответствует любой трехзначной последовательности, которая не является 999
.
Ответ 2
Если вы хотите совместить слово A в строке и не соответствовать слову B. Например:
Если у вас есть текст:
1. I have a two pets - dog and a cat
2. I have a pet - dog
Если вы хотите найти строки текста, чтобы Иметь собаку для домашнего животного, а НЕ имеет cat, вы можете использовать это регулярное выражение:
^(?=.*?\bdog\b)((?!cat).)*$
Он найдет только вторую строку:
2. I have a pet - dog
Ответ 3
Совпадение с шаблоном и использование языка хоста для инвертирования логического результата совпадения. Это будет гораздо более разборчивым и удобным.
Ответ 4
notnot, воскрешая этот древний вопрос, потому что у него было простое решение, которое не упоминалось. (Нашел свой вопрос, проведя некоторое исследование для заданий по поиску регулярных выражений.)
Я столкнулся с ситуацией, когда мне нужно сопоставить (A и ~ B) шаблон.
Основное регулярное выражение для этого пугающе просто: B|(A)
Вы просто игнорируете общие совпадения и проверяете захват группы 1, который будет содержать A.
Пример (со всеми отказами относительно разбора html в регулярном выражении): A - цифры, B - цифры в пределах <a tag
Регулярное выражение: <a.*?<\/a>|(\d+)
Демо (посмотрите на группу 1 в правой нижней панели)
Ссылка
Как сопоставить шаблон, за исключением ситуаций s1, s2, s3
Как сопоставить шаблон, если...
Ответ 5
Дополнение к регулярному языку также является регулярным языком, но для его построения вам нужно создать DFA для обычного языка, и сделать любое допустимое изменение состояния в ошибке. См. этот для примера. На странице не говорится, что она преобразует /(ac|bd)/
в /(a[^c]?|b[^d]?|[^ab])/
. Переход от DFA к регулярному выражению не является тривиальным. Это проще, если вы можете использовать регулярное выражение без изменений и изменить семантику кода, как это было предложено ранее.
Ответ 6
pattern - re
str.split(/re/g)
вернет все, кроме шаблона.
Тест здесь
Ответ 7
(B)|(A)
затем используйте, какую группу 2 захватывает...
Ответ 8
Мой ответ здесь также может решить вашу проблему:
fooobar.com/info/10544/...
- Вместо замены вы должны использовать Match.
- Вместо группы
$1
вы будете читать группу $2
.
- Группа
$2
была сделана без захвата, чего вы бы избежали.
Пример:
Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");
Первая группа захвата указывает шаблон, который вы хотите избежать. Последняя группа захвата захватывает все остальное. Просто зачитайте эту группу, $2
.