У меня есть строка с символами * (звездочка) в качестве ввода. Строка считается недействительной, если она имеет две последовательные звездочки. Но есть escape-символ\(обратная косая черта).
Например:
Я нахожусь на таком регулярном выражении, которое приводит к некорректному результату:
/[^\\]\*\*/
- java.util.regex.Pattern.compile("/[^\\\\]\\*\\*/")
/([^\\]*?\*\*)|(\*\*)/
- java.util.regex.Pattern.compile("/([^\\\\]*?\\*\\*)|(\\*\\*)/")
.Кроме того, я читал о жадных, неохотных и властных количественных значениях здесь http://docs.oracle.com/javase/tutorial/essential/regex/quant.html
Я знаю, что проблема связана с совпадением нулевой длины, но не может создать правильное регулярное выражение.
Вы ищете регулярное выражение, которое будет соответствовать только недействительным строкам? Это должно сделать:
"(?<!\\\\)\\*\\*+"
Он будет соответствовать двум или более звездочкам в строке, а не косой чертой.
EDIT: (?<!foo)
thingy называется "негативный внешний вид". Он соответствует любому нулевому месту в строке, которой не сразу предшествует область, соответствующая регулярному выражению внутри круглых скобок (в этом случае "foo" или обратная косая черта в вашем). Сначала я имел это как [^\\\\]
, что почти одно и то же (в данном случае), за исключением того, что оно соответствует любому символу, отличному от обратного слэша, но не отсутствию символа, как в начале строки в "**".
Существует хорошее подробное описание lookarounds (look-behind и look-ahead), а также множество других "волшебных" регулярных выражений здесь
Используйте метод string.matches. Это возвращает true для действительных строк.
String s1 = "case**";
String s2 = "case\\**";
System.out.println(s1.matches("(?=.*(\\\\\\*\\*|\\*\\\\\\*)).*"));
System.out.println(s2.matches("(?=.*(\\\\\\*\\*|\\*\\\\\\*)).*"));
Вывод:
false
true