Регулярное выражение для разбиения строки с использованием пробела, когда оно не заключено в одинарные или двойные кавычки - PullRequest
101 голосов
/ 14 декабря 2008

Я новичок в регулярных выражениях и буду признателен за вашу помощь. Я пытаюсь собрать выражение, которое разделит пример строки, используя все пробелы, которые не заключены в одинарные или двойные кавычки. Моя последняя попытка выглядит так: (?!") и не совсем работает. Это расщепляется на пространство перед цитатой.

Пример ввода:

This is a string that "will be" highlighted when your 'regular expression' matches something.

Желаемый вывод:

This
is
a
string
that
will be
highlighted
when
your
regular expression
matches
something.

Обратите внимание, что "will be" и 'regular expression' сохраняют пробел между словами.

Ответы [ 13 ]

0 голосов
/ 12 сентября 2016

Вы также можете попробовать это:

    String str = "This is a string that \"will be\" highlighted when your 'regular expression' matches something";
    String ss[] = str.split("\"|\'");
    for (int i = 0; i < ss.length; i++) {
        if ((i % 2) == 0) {//even
            String[] part1 = ss[i].split(" ");
            for (String pp1 : part1) {
                System.out.println("" + pp1);
            }
        } else {//odd
            System.out.println("" + ss[i]);
        }
    }
0 голосов
/ 12 марта 2013

Надеюсь, пара полезных поправок на принятый ответ Яна:

(['"])((?:\\\1|.)+?)\1|([^\s"']+)
  • Позволяет экранировать кавычки внутри строк в кавычках
  • Избегает повторения шаблона для одинарных и двойных кавычек; это также упрощает добавление большего количества символов кавычек при необходимости (за счет еще одной группы захвата)
0 голосов
/ 14 декабря 2008

Я вполне уверен, что это невозможно при использовании одних только регулярных выражений. Проверка, содержится ли что-то внутри какого-либо другого тега, является операцией синтаксического анализа. Это похоже на ту же проблему, что и попытка синтаксического анализа XML с помощью регулярного выражения - это не может быть сделано правильно. Вы можете получить желаемый результат, многократно применяя негадальное, неглобальное регулярное выражение, которое соответствует строкам в кавычках, а затем, если вы не можете найти ничего другого, разбейте его на пробелы ..., которые имеют ряд проблемы, в том числе отслеживание исходного порядка всех подстрок. Лучше всего просто написать действительно простую функцию, которая перебирает строку и извлекает нужные вам токены.

...