Вы можете сделать это, используя нежадным подход:
"\\\"(.*?)\\\""
А нежадным отрубов группы с момента ее можно. В этом случае с момента нахождения второй двойной кавычки.
Или матч например, все персонажи APPART из цитаты:
"(\\\"[^\"]*)\\\")"
[^list]
означает, что все символы, кроме символов в list
Кроме того, возможно, вы можете сделать его более удобным для чтения, исключив двойное экранирование:
"[\"]([^\"]*)[\"]"
Обратите внимание, что это не работает для рекурсивных узоров: если строка для ma tch is "foo "inner" bar"
, он будет соответствовать "foo "
, а не "foo "inner" bar"
, но я предполагаю, что это семантика, которую вы ищете.
EDIT:
в случае, если вы позволяете избежали двойные кавычки, а также, вы можете использовать отрицательный просмотра назад:
"([\"][^\"]*(?<!\\\\)[\"])"
(?<!\\\\)
- неэкранированный (?<!\)
- означает, что один символ прежде, забой является не допускается.
Проблема с этим подходом, однако, является то, что один может также указать строку:
"Foo\\"
Это используется, чтобы указать строку Foo\
(реальный возврат каретки).
Возможное решения состоит в проверку, если просмотр назад содержит нечетное число последовательных обратных косых черт, но это не поддерживается Java, решение, чтобы сделать внутренний цикл согласования более сложным:
"([\"]([^\\\\\"]*([\\\\].)*)*[\"])"
неэкранированных это регулярное выражение:
(["]([^\\"]*([\\].)*)*["])
^^ ^ ^
| | | \- tailing double quote
| | \- if backslash, skip next character (for instance `\\`, `\"` or `\n`
| \- match all except double quotes and backslashes
\-beginning double quote
Смотрите эту jdoodle, он считывает сырую строку из stdin
и выводит захваченные группы.
Эй, это сработало отлично, но скажем, например, у меня есть это: '' это '' строка \ "", тогда это не сработает, вы знаете, что для этого нужно обход? – bernhardkiv
Да. подождите несколько минут ... –
@bernhardkiv: обновлено, лучше? –