Java Regex: Каким будет регулярное выражение для шаблона типа «10 {1,1% d}, 10 {2,1% d}»? - PullRequest
0 голосов
/ 15 марта 2019

Рассмотрим следующий пример:

Regex: (.\*?),(.\*)
String: 10,20
Result: Group1: 10; Group2: 20

Аналогично

Regex: ???
String: 10{1,1 %d},10{2,1 %d}
Expected result: Group1: 10{1,1 %d}; Group2: 10{2,1 %d}

Как и во втором примере, строка содержит "," много раз, что приводит к неожиданному выводу.В таком случае, Как мы можем достичь ожидаемого результата?

1 Ответ

0 голосов
/ 15 марта 2019

Тщательное разделение

Так что звучит так, будто вы хотите разделить строку запятыми, если запятые не заключены в пару соответствующих разделителей, таких как "{} [] <> ||".На данный момент я предполагаю, что этот файл будет обычным и не будет иметь вложенных маркеров.

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


Код

String pattern = "[^,]*?({.*?}|\[.*?]|<.*?>|\|.*?\|)[^,]*?";
Pattern p = Pattern.compile(pattern);

Этот шаблон должен сделать это для вас.Он будет соответствовать любой строке, которая начинается без запятой, имеет вид оболочки в "{} [] <> ||"и может закончиться текстом.Вы можете даже обернуть pattern в группе и повторить.Например:

String pattern = "([^,]*?({.*?}|\[.*?]|<.*?>|\|.*?\|)[^,]*?)+"; // Notice the parens on the outside and the '+'
Pattern p = Pattern.compile(pattern);

Если фигурные скобки являются необязательными, также учтите:

String pattern = "[^,]*?({.*?}|\[.*?]|<.*?>|\|.*?\|)?[^,]*?"; // Notice the added '?'
Pattern p = Pattern.compile(pattern);

Я точно забыл, какова реализация java для поиска строки по нескольким результатам, однако это работает в pythonс использованием методов search, match и finditer, и шаблон будет по-прежнему работать с Java.

...