Негативное отрицание регулярных выражений работает неправильно

Я использую следующее регулярное выражение:

^[^^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)|(    )))

Смотрите https://regexr.com/3ke44

^((?![^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, , (, |

Используя групповую конструкцию вместо списка символов (квадратные скобки), вам повезет больше

Другие вопросы по тегам