#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 используются, когда вы хотите захватить для последующего использования отдельные разделы более крупного совпадения, но здесь нет необходимости в более крупном совпадении. В вашем регулярном выражении группа захвата в любом случае будет фиксировать только последнее совпадение шаблона в круглых скобках. Для простой группировки его более эффективно использовать
(?:)
, а не()
. Кроме того, ваше регулярное выражение будет соответствовать пустой строке, потому что вы используете*
вместо.