Java Pattern раскол с учетом захвата групп - PullRequest
2 голосов
/ 16 марта 2012

Мне нужно разделить строку, передавая регулярное выражение, но токен разделения - это просто группа 1 регулярного выражения.Пример:

Original String = "paulo\\;Is\\;In;Real;Doubt"

Массив, сформированный с использованием split = ["paulo\\;Is\\;In", "Real", "Doubt"]

Моей первой идеей было использовать в качестве регулярного выражения: [^\\\\][;], но этоочевидно, не сработало.

Вывод был: ["paulo\\;Is\\;I", "Rea", "Doubt"] (я использую метод String.split().)

Моя вторая идея состояла в том, чтобы использовать ; в качестве группы: [^\\\\]([;]), но я просто не могу сказать методу split просто рассматривать group(1) как токен расщепления.

Ответы [ 4 ]

3 голосов
/ 16 марта 2012

На ваш вопрос сложно ответить, потому что он совершенно неясен. Вы говорите, что ваш разделенный токен "просто группа 1 регулярного выражения". Группа 1 какого регулярного выражения?

РЕДАКТИРОВАТЬ: все еще трудно ответить, почему бы вам не уточнить?

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

Пример:

"paulo\\;Is\\;In;Real;Doubt".split("(?<!\\\\);");

1010 * дает *

[ "paulo\;Is\;In", "Real", "Doubt" ]
0 голосов
/ 16 марта 2012

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

Необработанное регулярное выражение:

(?:(?<=;)|(?<=^))([^;\\]*(?:\\.[^;\\]*)*)(?:;|$)

расширено:

(?:                              // prevent (mitigate) re-capture of last field
   (?<=;)
 | (?<=^)
)

( [^;\\]* (?:\\.[^;\\]*)* )      // Capture the field, grp 1 (can be blank)

(?:                              // The delimiter or end o string                             
   ;
 |
   $
)
0 голосов
/ 16 марта 2012

Ну, мне пришлось немного изменить ваш ввод, так как я получил ошибки, когда

String x = "paulo\\;Is\\;In;Real;Doubt";
String[] res = x.split("\\\\;");
0 голосов
/ 16 марта 2012

Проблема в том, что приведенное ниже выражение истинно:

("\;").equals(";")

Таким образом, ваша исходная строка равна:

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