2017-01-26 12 views
1

TLDR: Я ищу, чтобы захватить все за пределами кавычек, но, похоже, я не могу это сделать на Java с этим регулярным выражением \ "|" (?: \ "| [^ "]) *" | ([^ \ "] +), пока он работает на таких сайтах, как http://myregexp.com/. Может ли кто-нибудь указать мне, что я делаю неправильно?Java Regex - Захват всех внешних котировок

Привет, В настоящее время я пытаюсь проанализировать исходный код .java и извлечь в виде строки все внешние кавычки (игнорируя экранированные кавычки).

Например, в этой строке:

Это должно быть захвачена «это не» и «не \» это \ «либо».

Я должен уметь с шаблоном и совпадением найти «Это должно быть захвачено», «и», «.».

В настоящее время у меня есть \ "[^ \"] + \ "| ([^ \"] +), который хорошо работает, если в документе есть равная пара "", но ломается, как только так как есть беглый.

В онлайн-тестировщиках регулярных выражений я пробовал \ "|" (?: \ "| [^"]) * "| ([^ \"] +), который, похоже, делает то, что я ищу for, но когда я пробую это в Java, это не так.

+0

Try 'List [] Рез = ДЕЛЕНИЕ ("\\ с * \"[^ \" \\\\] * (? : \\\\. [^ \ "\\\\] *) * \" \\ s * ");' –

+0

См. https://ideone.com/NgMozq. –

+0

Это хорошо работает, спасибо большое! Я попытаюсь понять, как работает регулярное выражение, и применять его для комментариев исходного кода (например,/* * /,/** **/и // \ n). – Beerbossa

ответ

1

кажется для текущей задачи, вы можете использовать шаблон, чтобы соответствовать двойным кавычкам литералов разделить строки:

List[] res = s.split("\\s*\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"\\s*"); 

ВИДЕТЬ Java demo:

String s = "This should be captured \"not this\" and \"not \\\"this\\\" either\"."; 
String[] res = s.split("\\s*\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\"\\s*"); 
System.out.println(Arrays.toString(res)); 
// => [This should be captured, and, .] 

деталь шаблонной:

  • \\s* - 0+
  • пробельные символы
  • \" - двойная цитата
  • [^\"\\\\]* - 0+, кроме " символов и \
  • (?:\\\\.[^\"\\\\]*)* - 0+ последовательности:
    • \\\\. - это \ и любой символ кроме символов разрыва строки
    • [^\"\\\\]* - символы 0+ кроме " и \
  • \"\\s* - это " и 0+ пробельные символы
+0

Спасибо, это было довольно точно, что я искал! Это помогло мне лучше понять синтаксис, и теперь я могу попытаться создать свой собственный для остальных шагов, которые мне нужны. – Beerbossa