Проблема не столько в вашем регулярном выражении, сколько в ваших тестовых строках.Одиночная обратная косая черта перед внутренними кавычками в строках второго и третьего примера расходуется при разборе литеральной строки.Строка, передаваемая в механизм регулярных выражений, не имеет обратной косой черты перед кавычкой.(Попробуйте распечатать его.) Вот проверенная версия вашей функции, которая работает как положено:
import java.util.regex.*;
public class TEST
{
public static void main(String[] args) {
String[] arr = new String[]
{
"\"tuco\"",
"\"tuco \\\" ABC\"",
"\"tuco \\\" ABC \\\" DEF\""
};
//old: Pattern pattern = Pattern.compile("\"(?:[^\"\\\\]+|\\\\.)*\"");
Pattern pattern = Pattern.compile(
"# Match double quoted substring allowing escaped chars. \n" +
"\" # Match opening quote. \n" +
"( # $1: Quoted substring contents. \n" +
" [^\"\\\\]* # {normal} Zero or more non-quote, non-\\. \n" +
" (?: # Begin {(special normal*)*} construct. \n" +
" \\\\. # {special} Escaped anything. \n" +
" [^\"\\\\]* # more {normal} non-quote, non-\\. \n" +
" )* # End {(special normal*)*} construct. \n" +
") # End $1: Quoted substring contents. \n" +
"\" # Match closing quote. ",
Pattern.DOTALL | Pattern.COMMENTS);
for (String str : arr) {
Matcher matcher = pattern.matcher(str);
System.out.println(matcher.matches());
}
}
}
Я заменил ваше регулярное выражение на улучшенную версию (взято из MRE3 ),Обратите внимание, что этот вопрос часто задают.Пожалуйста, смотрите этот ответ , где я сравниваю несколько функционально эквивалентных выражений.