如何让这个模式工作:
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}])|$)
)"。