2015-02-12 5 views
1

Мне нужно выяснить регулярное выражение (шаблон), чтобы иметь возможность получать символы между двойными кавычками.Java регулярное выражение для получения символов между двойными кавычками

Это немного трудно объяснить, но вот то, что я хочу:

Если я запускаю это через упомянутое выражение:

say("ex" + "ex2", "ex3"); 

Я тогда будет иметь возможность получить три матча, которые;

"ex", "ex2", and "ex3" 

все в своих строках.

Я уже пробовал это выражение:

Pattern.compile("\\\"(.*)\\\""); 

Но вместо того, чтобы дать мне три различных .group() с, я получаю один .group который "ex", "ex2", and "ex3"

Так кто-нибудь знает выражение, чтобы дать мне выход я хочу?

ответ

5

Вы можете сделать это, используя нежадным подход:

"\\\"(.*?)\\\"" 

А нежадным отрубов группы с момента ее можно. В этом случае с момента нахождения второй двойной кавычки.

Или матч например, все персонажи 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 и выводит захваченные группы.

+0

Эй, это сработало отлично, но скажем, например, у меня есть это: '' это '' строка \ "", тогда это не сработает, вы знаете, что для этого нужно обход? – bernhardkiv

+0

Да. подождите несколько минут ... –

+0

@bernhardkiv: обновлено, лучше? –

Смежные вопросы