Відповіді:
Ви можете використовувати твердження наперед:
(?!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, де буде міститись А.
Приклад (з усіма запереченнями щодо розбору 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, '')
, тоді не потрібно повторювати їх. також якщо ви кинете в хороший трейлінг \ s? як str.replace(/\re\s?/g, '')
тоді, ви позбудетеся від будь-яких повторюваних пробілів, які б вам довелося замінити щось посеред рядка
Моя відповідь тут може також вирішити вашу проблему:
https://stackoverflow.com/a/27967674/543814
$1
ви б читали групу $2
.$2
була зроблена не захоплення там, чого ви б уникнути.Приклад:
Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");
Перша група захоплення визначає шаблон, якого ви хочете уникати. Остання група, яка захоплює, фіксує все інше. Просто зачитати цю групу, $2
.
findstr
тег, оскільки всі відповіді тут не вірні для тегу.