Ответы:
Вы можете использовать прогнозное утверждение:
(?!999)\d{3}
Этот пример соответствует трем цифрам, кроме 999
.
Но если у вас нет реализации регулярного выражения с этой функцией (см. Сравнение разновидностей регулярных выражений ), вам, вероятно, придется создавать регулярное выражение с основными функциями самостоятельно.
Совместимое регулярное выражение только с базовым синтаксисом будет:
[0-8]\d\d|\d[0-8]\d|\d\d[0-8]
Это также соответствует любой последовательности из трех цифр, которой нет 999
.
Если вы хотите сопоставить слово A в строке, а не слово B. Например: если у вас есть текст:
1. I have a two pets - dog and a cat
2. I have a pet - dog
Если вы хотите найти строки текста, в которых есть собака для домашнего питомца и у которых нет кошки, вы можете использовать это регулярное выражение:
^(?=.*?\bdog\b)((?!cat).)*$
Он найдет только вторую строку:
2. I have a pet - dog
Сопоставьте с шаблоном и используйте основной язык для инвертирования логического результата совпадения. Это будет намного более разборчивым и ремонтопригодным.
нет, воскресение этого древнего вопроса, потому что у него было простое решение, которое не было упомянуто. (Нашел свой вопрос во время исследования квеста «Регулярное вознаграждение» .)
Я столкнулся с ситуацией, когда я должен соответствовать шаблону (A и ~ B).
Основное выражение для этого пугающе просто: B|(A)
Вы просто игнорируете общие совпадения и изучаете захваты группы 1, которые будут содержать A.
Пример (со всеми заявлениями об отказе от синтаксического анализа html в регулярных выражениях): A это цифры, B это цифры внутри <a tag
Регулярное выражение: <a.*?<\/a>|(\d+)
Демо (посмотрите на Группу 1 в нижней правой панели)
Ссылка
\d
на [[:digit:]]
. В первой ссылке упоминается, что она специфична для Perl и PHP: «Существует вариант с использованием синтаксиса, специфичного для Perl и PHP, который выполняет то же самое».
Дополнение к обычному языку также является обычным языком, но для его построения необходимо создать DFA для обычного языка и внести любое допустимое изменение состояния в ошибку. Смотрите это для примера. То, что страница не говорит, - то, что это преобразовало /(ac|bd)/
в /(a[^c]?|b[^d]?|[^ab])/
. Преобразование из DFA обратно в регулярное выражение не является тривиальным. Это проще, если вы можете использовать регулярное выражение без изменений и изменить семантику в коде, как предложено ранее.
replace
str.replace(/re/g, '')
, тогда нет необходимости возвращаться к ним. также, если вы добавите хороший трейлинг? как str.replace(/\re\s?/g, '')
тогда, вы избавляетесь от любых дубликатов, которые вы могли бы получить от чего-то, заменяемого в середине строки
Мой ответ здесь также может решить вашу проблему:
https://stackoverflow.com/a/27967674/543814
$1
вы читаете группу $2
.$2
была сделана без захвата там, что вы бы избежать.Пример:
Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");
Первая группа захвата определяет шаблон, который вы хотите избежать. Последняя группа захвата захватывает все остальное. Просто зачитайте эту группу $2
.
findstr
тег, так как все ответы здесь недействительны для тега.