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

时间:2011-10-05 18:13:39

标签: java regex

如何让这种模式发挥作用:

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 regex patterns

这是这样的连字词:“aaa-bb”,“aaa-bb-cc”,“aaa-bb-c-dd”。那么,我能做到吗?

1 个答案:

答案 0 :(得分:1)

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

但是,也许你可以重新制定你的问题。

例如,如果要在单词(可以包含连字符)之间进行拆分,请尝试以下表达式:

(?>[^\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}]+|^-|-$)

第一部分现在读作“任何非字符,其后不是任意数量的非字符字符”,并且也应该与.--匹配。

修改:如果您想匹配可能包含连字符的字词,请尝试以下表达式:

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

这意味着“任何字母序列(\p{L}+)后跟任意数量的序列,其中包含一个减号和至少一个字母((?:-\p{L}+)*+)。该序列必须以任一开头为序或任何不是字母或减号((?>(?<=[^-\p{L}])|^))的东西,后跟任何非字母或减号或输入结尾((?>(?=[^-\p{L}])|$))“。

相关问题