Java正则表达式混合了两种模式



如何让这个模式工作:

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

基本上,这将用任何类型的标点符号(p{p})或任何类型的空格(p{Z})分割我的String[]句子。但是我想排除以下情况:

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

模式说明:Java正则表达式模式

就是像这样的连字符单词:"aaa-bb", "aaa-bb-cc", "aaa-bb-c-dd"。那么,我能做到吗?

不幸的是,似乎你不能合并两个表达式,至少据我所知。

但是,也许你可以重新表述你的问题。

例如,如果您想在单词之间进行分割(可以包含连字符),请尝试使用此表达式:

(?>[^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"}

正则表达式可能需要一些额外的优化,但这只是一个开始。

Edit:这个表达式应该去掉split中的空字符串:

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

第一部分现在读作"任何非字符,它不是减号后面跟着任意数量的非字符字符",并且也应该匹配.--

编辑:如果您想要匹配可能包含连字符的单词,请尝试此表达式:

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

这意味着"任何字母序列(p{L}+)后面跟着由一个减去和至少一个多字母((?:-p{L}+)*+)组成的任意数量的序列"。该序列必须以开头或非字母或减号((?>(?<=[^-p{L}])|^))开头,后跟非字母或减号或输入结束((?>(?=[^-p{L}])|$))"。