Негативное отрицание регулярных выражений работает неправильно
Я использую следующее регулярное выражение:
^[^^DD(| ]
С этими данными:
jfklajf
^DD
hjhkjk
DIOL(.D1)
Выражение правильно идентифицирует первую строку (jfkl...), но не может идентифицировать последнюю строку (DIOL...). Мне нужно идентифицировать обе линии как не соответствующие шаблону ^DD(
в начале строки.
Что я делаю неправильно?
Спасибо
5 ответов
Согласно вашему комментарию вы можете использовать нег. Взгляд вперед в сочетании с якорями:
^(?!\^DD|[ ]{4}).+
Сломанный, это говорит:
^ # match start of the line
(?! # neg. lookahead
\^DD # neither ^DD
| # nor
[ ]{4} # four spaces
)
.+ # omit empty lines
Смотрите демо на regex101.com. Обратите внимание, что вам нужно удвоить обратную обратную косую черту в Java
,
^((?![^DD|\s{4}]).)
объяснение
^...Start of the line
((?!Expression).)...not matching
[^DD|\s{4}]...Pattern 1 (^DD) or Pattern 2 (\s{4})
\s{4}...whitespaces 4 times
Ваше регулярное выражение говорит: как предложение, не начинающееся с ^, D, (, | или пробела.
Конструкция [] - это символьный класс, означающий, что он будет соответствовать любому одному символу из класса, начиная с класса ^, отрицая его и означая любой один символ, отсутствующий в классе.
Как указано в ответах других, вы должны искать негативную перспективу или, если вам нравится сложность, и я хорошо понимаю вашу попытку:
^([^^][^D]{2}[^(]|[^ ]{4})
Может быть:
(?!^\^DD|^\s+)^.+$
Посмотреть демо
Ваш в настоящее время пытается сопоставить любой символ в этом списке:
D
, ,
(
, |
Используя групповую конструкцию вместо списка символов (квадратные скобки), вам повезет больше