Вот один шаблон, который вы можете использовать, который эквивалентен трем, которые у вас есть выше:
Pattern etcPattern = Pattern.compile(
"\\s*([a-zA-Z_]\\w*)\\s*=\\s*"+
"(\"|'|.{0,0})(.*?)\\2"+ //QUOTE MATCHING
"\\s*");
Существует три различия между этим и вашим: сначала я заменил выражение [a-zA-Z0-9_] на его предопределенный класс символов \ w (символ слова). Вторая часть (QUOTE MATCHING) - это шаблон, который будет сопоставлять и отбрасывать внешние сбалансированные кавычки, но также разрешать несбалансированные кавычки, как это делали ваши три шаблона.
Он начинается с использования шаблона (\ "| '|. {0,0}). Это
- Двойная кавычка
- Одиночная цитата
- Что-нибудь ноль раз
Затем ваш шаблон. *, За которым следует обратная ссылка \ 2. Обратная ссылка говорит, чтобы соответствовать тому, что было сопоставлено с шаблоном 2 (образец цитаты). Вот где третий случай выше важен. Если значение не начинается с одинарной или двойной кавычки, оно должно быть в состоянии игнорировать его. Таким образом, он начинается с попытки сопоставить одну из цитат. Если это невозможно, то он будет соответствовать пустой строке, что, в свою очередь, позволяет обратным ссылкам соответствовать пустой строке.
Последнее изменение, заставляющее его работать, состоит в том, чтобы изменить внутренний шаблон. *, Чтобы он неохотно (на. *?), Чтобы он позволял сопоставлять кавычки с обратной ссылкой, если это возможно, и удалялся.
Так что вы должны иметь возможность запустить это как:
Matcher matcher = etcPattern.matcher(line);
if (matcher.matches()) {
System.out.println(matcher.group(1) + " == " + matcher.group(3));
}
эквивалентно вашему примеру выше (обратите внимание, что значение теперь находится в группе совпадений 3 вместо двух. Как я уже сказал, это соответствует тому, что сделали ваши шаблоны, в частности, это позволит использовать несбалансированные кавычки и разрешить любые внутренние кавычки для значения.