Регулярное выражение для разбора простого предложения слова, разделенные двойными кавычками

#regex #parsing #sentence

Вопрос:

У меня есть пример предложения, которое выглядит так:

""Music"",""EDM / Electronic"",""organizer: Tiny Toons""

Я хочу разобрать это предложение на токены:

["Music", "EDM / Electronic", "organizer: Tiny Toons"]

Мое регулярное выражение foo довольно ограничено, и я нахожусь под некоторым давлением времени.

Мне было интересно, может ли кто — нибудь помочь мне создать регулярное выражение (совместимое с Java8-поскольку я использую Clojure для применения регулярного выражения) для анализа этих групп захвата.

Спасибо тебе, Джейсон.

Ответ №1:

Предполагая, что предложение состоит из всей строки и что в нем нет запятых или " их нужно сопоставить, вы можете просто использовать

 "[^,"] "  

Если приведенные выше предположения неверны, пожалуйста, приведите примеры возможных входных строк и подробные сведения о том, какие символы могут отображаться в разделах, которые вы хотите сопоставить.

Простой пример java того, как использовать регулярное выражение:

 String sentence = """Music"",""EDM / Electronic"",""organizer: Tiny Toons"""; Matcher matcher = Pattern.compile("[^,"] ").matcher(sentence); Listlt;Stringgt; matches = new ArrayListlt;Stringgt;(); while (matcher.find()) {  matches.add(matcher.group()); } System.out.println(matches);  

Комментарии:

1. Спасибо @MikeM, это именно то, что я хочу, я не хочу использовать дополнительные двойные кавычки, но только внутренние кавычки, ценю ответ. Краткое разъяснение, почему я не должен использовать здесь группу захвата? Я пытался #"(""[^"]*"")*" , но получаю слишком много ударов

2. Группы захвата @jasonmac используются, когда вы хотите захватить для последующего использования отдельные разделы более крупного совпадения, но здесь нет необходимости в более крупном совпадении. В вашем регулярном выражении группа захвата в любом случае будет фиксировать только последнее совпадение шаблона в круглых скобках. Для простой группировки его более эффективно использовать (?:) , а не () . Кроме того, ваше регулярное выражение будет соответствовать пустой строке, потому что вы используете * вместо .