как отрицать любое регулярное выражение в Java - PullRequest
10 голосов
/ 23 декабря 2011

У меня есть регулярное выражение, которое я хочу отрицать, например,

/(.{0,4})

, который String.matches возвращает следующее

"/1234" true
"/12" true
"/" true
"" false
"1234" false
"/12345" false

Есть ли способ отрицать (используя только regx) к вышесказанному, чтобы получить следующие результаты:

"/1234" false
"/12" false
"/" false
"" true
"1234" true
"/12345" true

Я ищу общее решение, которое работало бы для любого регулярного выражения без переписывания всего регулярного выражения.

Я посмотрелв следующем Как отменить все регулярные выражения? , используя (?! pattern), но мне кажется, что это не работает.

Следующий regx

(?!/(.{0,4}))

возвращает следующее:

"/1234" false
"/12" false
"/" false
"" true
"1234" false
"/12345" false

, что не то, что я хочу.Любая помощь будет оценена.

1 Ответ

27 голосов
/ 23 декабря 2011

Вам нужно добавить якоря.Исходное регулярное выражение (за вычетом ненужных скобок):

/.{0,4}

... соответствует строке, которая содержит косую черту, за которой следуют от нуля до четырех символов.Но поскольку вы используете метод matches(), он автоматически привязывается, как если бы он был действительно:

^/.{0,4}$

Чтобы добиться обратного, вы не можете полагаться на автоматическое закрепление;Вы должны сделать по крайней мере конечный якорь явным в предвкушении.Вы также должны добавить к регулярному выражению .*, поскольку matches() требует, чтобы регулярное выражение потребляло всю строку:

(?!/.{0,4}$).*

Но я рекомендую вам явно привязать все регулярное выражение, например так:

^(?!/.{0,4}$).*$

Это не причиняет вреда и делает ваше намерение совершенно ясным, особенно людям, которые выучили регулярные выражения из других ароматов, таких как Perl или JavaScript.Автоматическое закрепление метода matches() весьма необычно.

...