У меня есть язык, который определяет строку как ограничиваемую одиночными или двойными кавычками, где разделитель спрятан внутри строки, удваивая его. Например, все следующие строки являются юридическими:
'This isn''t easy to parse.'
'Then John said, "Hello Tim!"'
"This isn't easy to parse."
"Then John said, ""Hello Tim!"""
У меня есть набор строк (определенный выше), ограниченный тем, что не содержит цитаты. То, что я пытаюсь сделать с помощью регулярных выражений, заключается в анализе каждой строки в списке. Например, вот вход:
"Некоторые строки # 1" ИЛИ "Некоторые строки # 2" И "Некоторые строки" # 3 "XOR
'Some" String "# 4' HOWDY" Some "" String "" # 5" FOO 'Some' 'String' '# 6'
Регулярное выражение для определения того, является ли строка такой формы тривиальным:
^(?:"(?:[^"]|"")*"|'(?:[^']|'')*')(?:\s+[^"'\s]+\s+(?:"(?:[^"]|"")*"|'(?:[^']|'')*')*
После выполнения вышеуказанного выражения, чтобы проверить, имеет ли он такую форму, мне нужно другое регулярное выражение, чтобы получить каждую строку с разделителем из ввода. Я планирую сделать это следующим образом:
Pattern pattern = Pattern.compile("What REGEX goes here?");
Matcher matcher = pattern.matcher(inputString);
int startIndex = 0;
while (matcher.find(startIndex))
{
String quote = matcher.group(1);
String quotedString = matcher.group(2);
...
startIndex = matcher.end();
}
Я хотел бы регулярное выражение, которое фиксирует символ кавычки в группе # 1, и текст внутри кавычек в группе # 2 (я использую Java Regex). Итак, для вышеприведенного ввода я ищу регулярное выражение, которое выдает следующий результат в каждой итерации цикла:
Loop 1: matcher.group(1) = "
matcher.group(2) = Some String #1
Loop 2: matcher.group(1) = '
matcher.group(2) = Some String #2
Loop 3: matcher.group(1) = "
matcher.group(2) = Some 'String' #3
Loop 4: matcher.group(1) = '
matcher.group(2) = Some "String" #4
Loop 5: matcher.group(1) = "
matcher.group(2) = Some ""String"" #5
Loop 6: matcher.group(1) = '
matcher.group(2) = Some ''String'' #6
Шаблоны, которые я пробовал до сих пор (un-escaped, а затем escape-код для Java-кода):
(["'])((?:[^\1]|\1\1)*)\1
"([\"'])((?:[^\\1]|\\1\\1)*)\\1"
(?<quot>")(?<val>(?:[^"]|"")*)"|(?<quot>')(?<val>(?:[^']|'')*)'
"(?<quot>\")(?<val>(?:[^\"]|\"\")*)\"|(?<quot>')(?<val>(?:[^']|'')*)'"
Оба они не работают при попытке скомпилировать шаблон.
Возможно ли такое регулярное выражение?