Java регулярное выражение смешать два шаблона - PullRequest
1 голос
/ 05 октября 2011

Как мне заставить этот шаблон работать:

Pattern pattern = Pattern.compile("[\\p{P}\\p{Z}]");

По сути, это разделит мое предложение String [] на любой знак пунктуации (p {P} или любой тип пробела (p {Z}). Но я хочу исключить следующий случай:

(?<![A-Za-z-])[A-Za-z]+(?:-[A-Za-z]+){1,}(?![A-Za-z-])

образец, объясненный здесь: Шаблоны регулярных выражений Java

, которые являются дефисными словами, подобными этому: "aaa-bb "," aaa-bb-cc "," aaa-bb-c-dd ". Итак, я могу это сделать?

1 Ответ

1 голос
/ 05 октября 2011

К сожалению, похоже, что вы не можете объединить оба выражения, по крайней мере, насколько мне известно.

Однако, возможно, вы сможете переформулировать свою проблему.

Если, например, выхотите разделить слова (которые могут содержать дефисы), попробуйте следующее выражение:

(?>[^\p{L}-]+|-[^\p{L}]+|^-|-$)

Это должно соответствовать любой последовательности буквенных символов, которые не являются минусом, или любому минусу, который следует за моим не-символ буквы или это первый или последний символ во входных данных.

Использование этого выражения для разбиения должно привести к следующему:

input="aaa-bb, aaa-bb-cc, aaa-bb-c-dd,no--match,--foo"
ouput={"aaa-bb","aaa-bb-cc","aaa-bb-c-dd","no","match","","foo"}

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

Редактировать : Это выражение должно избавиться от пустой строки в разбиении:

(?>[^\p{L}-][^\p{L}]*|-[^\p{L}]+|^-|-$)

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

Редактировать : в случае, если вы хотите сопоставить слова, которые могут содержатьдефисs, попробуйте следующее выражение:

(?>(?<=[^-\p{L}])|^)\p{L}+(?:-\p{L}+)*(?>(?=[^-\p{L}])|$)

Это означает «любую последовательность букв (\p{L}+), за которой следует любое количество последовательностей, состоящих из одного минуса и, как минимум, еще одной буквы ((?:-\p{L}+)*+).Этой последовательности должен предшествовать либо начало, либо что-либо, не являющееся буквой или минусом ((?>(?<=[^-\p{L}])|^)), и за ним должно следовать все, что не является буквой или минусом или концом ввода ((?>(?=[^-\p{L}])|$)) ".

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