2015-01-07 4 views
1

Мне нужно немного сложного шаблона регулярного выражения java для достижения следующего.Java Regex принять что-либо в квалификаторе

Accept ничего wihtin классификатором сказать "$$" Что-то вроде ниже делает большую часть работы:

Pattern rc = Pattern.compile("[\\$\\$].*[\\$\\$]"); 

Это будет принимать строки, как: "$$ANYTHING$$", "[email protected]#[email protected]!!!$$" и т.д.

Однако я хочу, чтобы запретить : $$abc$$xyz$$ как есть "$$" посередине! Пожалуйста, скажите мне, как это сделать. Также $$$$xyz$$ и $$xyz$$$$ должны быть отвергнуты

+0

Строка ввода всегда начинается и заканчивается на '$$'? – aioobe

+0

Помещение вещей в квадратных скобках, по-видимому, является распространенной ошибкой. Я действительно не знаю, почему. Квадратные скобки в регулярном выражении означают «match ** one ** character», если символ является одним из символов, перечисленных в квадратных скобках ». Таким образом, шаблон '[\\ $ \\ $]' будет соответствовать одной '' ', а не двухсимвольной последовательности' $$'. – ajb

ответ

3
^\\$\\$(?:(?!\\$\\$).)*\\$\\$$ 

Просто добавьте якоря и nagtive предпросмотр, чтобы убедиться, что $$ не в середине.

См. Демонстрационную версию.

https://regex101.com/r/sH8aR8/8

Проблема с регулярным выражением было [\\$\\$] будет принимать $ только один раз, как это внутри класса символов и без ^ и $ не будет строг с boundaries.Also .* будет принимать все, что почему ур второй $ принимался.

(?:(?!\\$\\$).)* удостоверяется, что $$ не происходит между ними.

EDIT:

Если подсчет $ не фиксируется использование

^\\$+(?:(?!\\$).)*\\$+$ 
+0

Отличный инструмент! Ваш шаблон удовлетворяет большинству случаев, кроме этого: $$ xyz $$$ Это должно быть принято. – lostcoderx

+0

@lostcoderx попробуйте https://regex101.com/r/sH8aR8/10 ..ногда он принимает – vks

+0

Отлично. Именно то, что мне нужно. :) – lostcoderx

0

Другой способ смотреть на него есть не 2 "$$" после первого $$:

^\\$\\$(?!(.*?\\$\\$){2}).*\\$\\$$ 
Смежные вопросы