Разделите все специальные символы и слова на элементы в списке строк - Regex - PullRequest
1 голос
/ 27 апреля 2020

Я пытаюсь разбить строку на список строк, слова разделяются, но окружающие символы, например .. "?()“”!" также разделяются.

Строка для разделения равна "testing “testing” “one two three” (hi there.) !word"

Вывод, который я хотел бы получить:

[",testing,",testing,",",one,two,three,",(,hi,there,.,),!,word]

Я использовал следующее регулярное выражение, которое почти работает, но, похоже, не подбирало предшествующие символы, такие как («et c ..

RegExp regex = RegExp("(?=[,.?!“”()])|\\s+");


list = context.split(regex).toList();

Буду очень признателен за любые предложения или помощь от мастеров Regex.

Ответы [ 2 ]

3 голосов
/ 27 апреля 2020

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

[,.?!“”()]|[^,.?!“”()\s]+

Объяснение

  • [,.?!“”()] Соответствует любому из перечисленных
  • | Или
  • [^,.?!“”()\s]+ Соответствует противоположному, кроме пробельных символов

Regex demo | Dart demo

Пример кода

void main() {
    final _regExp = RegExp(r'[,.?!“”()]|[^,.?!“”()\s]+');
    Iterable<String> matches = _regExp.allMatches("testing  “testing”  “one two three”  (hi there.) !word").map((m)=>m[0]);
    print(matches);
}

Выход

(testing, “, testing, ”, “, one, two, three, ”, (, hi, there, ., ), !, word)
2 голосов
/ 27 апреля 2020

Сопоставление битов для сохранения, как это сделал Птица # 4, кажется наиболее эффективным подходом. Однако если вы решили разделить и ваш механизм регулярных выражений поддерживает положительные взгляды и предпросмотры, вы можете разделить совпадения следующего регулярного выражения (некоторые из которых имеют нулевую ширину).

\ +|(?<=[^\w ])(?=\w)|(?<=\w)(?=[^\w ])|(?<=[^\w ])(?=[^\w ])

Демо

По ссылке я показал эффект замены каждого совпадения запятой, чтобы упростить идентификацию совпадений.

Механизм регулярных выражений выполняет следующие операции.

\ +          # match 1+ spaces (escape not necessary) 
|            # or
(?<=[^\w ])  # following must be preceded by a char other
             # than word char or space
(?=\w)       # preceding must be a word char
|            # or 
(?<=\w)      # following must be preceded by a word char
(?=[^\w ])   # preceding must be followed by a char other
             # than word char or space
|            # or
(?<=[^\w ])  # following must be preceded by a char other
             # than word char or space
(?=[^\w ])   # preceding must be followed by a char other
             # than word char or space

Все, кроме \ + (я избежал пробела, чтобы его было легче увидеть), это совпадения нулевой ширины, что означает, что строка разбита между двумя последовательными символами (например, между " и a в ..."a...) и никакие символы не потребляются. (?<=...) являются положительными взглядами за спиной ; (?=...) являются позитивными взглядами .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...