Я пишу анализатор строк, который я использую для анализа всех строк из текстового файла. Строки могут быть в одинарных или двойных кавычках, довольно просто, не так ли? Ну не совсем. Я написал регулярное выражение для сопоставления строк, как я хочу. но это дает мне ошибку StackOverFlow
для больших строк (я знаю, что java не очень хорош с регулярными выражениями для больших строк), это шаблон регулярных выражений (['"])(?:(?!\1|\\).|\\.)*\1
Это хорошо работает для всех строквходные данные, которые мне нужны, но как только появляется большая строка с ошибкой StackOverFlow
, я прочитал похожие вопросы, основанные на этом, такие как this , который предлагает использовать StringUtils.substringsBetween
, но не удаетсястроки типа '""'
, "\\\""
Итак, мой вопрос: что мне делать, чтобы решить эту проблему? Я могу предоставить больше контекста, если необходимо, просто прокомментируйте.
Редактировать: После тестирования ответа
Код:
public static void main(String[] args) {
final String regex = "'([^']*)'|\"(.*)\"";
final String string = "local b = { [\"\\\\\"] = \"\\\\\\\\\", [\"\\\"\"] = \"\\\\\\\"\", [\"\\b\"] = \"\\\\b\", [\"\\f\"] = \"\\\\f\", [\"\\n\"] = \"\\\\n\", [\"\\r\"] = \"\\\\r\", [\"\\t\"] = \"\\\\t\" }\n" +
"local c = { [\"\\\\/\"] = \"/\" }";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
}
Вывод:
Full match: "\\"] = "\\\\", ["\""] = "\\\"", ["\b"] = "\\b", ["\f"] = "\\f", ["\n"] = "\\n", ["\r"] = "\\r", ["\t"] = "\\t"
Group 1: null
Group 2: \\"] = "\\\\", ["\""] = "\\\"", ["\b"] = "\\b", ["\f"] = "\\f", ["\n"] = "\\n", ["\r"] = "\\r", ["\t"] = "\\t
Full match: "\\/"] = "/"
Group 1: null
Group 2: \\/"] = "/
Он неправильно обрабатывает экранированные кавычки.