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

Java正则表达式混合了两种模式,java,regex,Java,Regex,如何使此模式正常工作: 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-]) (? 此处解释的模式: 哪几个连字符是这样的:“aaa-bb”,“aaa-bb-cc”,“aaa-bb-c-dd”。那么,我可以这样做

如何使此模式正常工作:

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-])
(?
此处解释的模式:


哪几个连字符是这样的:“aaa-bb”,“aaa-bb-cc”,“aaa-bb-c-dd”。那么,我可以这样做吗?

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

然而,也许你可以重新表述你的问题

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

(?>[^\p{L}-]+|-[^\p{L}]+|^-|-$)
(?>(?<=[^-\p{L}])|^)\p{L}+(?:-\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}+
),后跟由一个减号和至少一个以上字母组成的任意数量的序列(
(?:-\p{L}+)*+
)。该序列必须以开头或任何非字母或减号(
(?>(?(?=[^-\p{L}]))
)开头。”.

不幸的是,至少据我所知,您似乎无法合并这两个表达式

然而,也许你可以重新表述你的问题

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

(?>[^\p{L}-]+|-[^\p{L}]+|^-|-$)
(?>(?<=[^-\p{L}])|^)\p{L}+(?:-\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}+
),后跟由一个减号和至少一个以上字母组成的任意数量的序列(
(?:-\p{L}+)*+
)。该序列必须以开头或任何非字母或减号(
(?(?=[^-\p{L}])

可能是我的猜测。我不想允许这样:“--aa”或“bb--c”等。这两种模式有效,我只需要将两者混合使用。那么……也许
[\\p{p}\\p{Z}^(?对不起,你的问题不是很清楚。你想匹配不是连字符的单词之间的任何分割吗?
[\\p{p}\\p{Z}-]
可能是我的猜测。我不想允许这样:“--aa”或“bb--c”等。这两种模式都有效,我只需要将两者混合使用。那么……也许,
[\\p{p}\\p{Z}^(?对不起,你的问题不是很清楚。你想匹配不是连字符的单词之间的任何分隔吗?嗯,谢谢。但是我需要排除“-”先出现的情况,比如:“-a”,“-aa bb“etc..@user974594所以,
“-aa bb”
不应该被分为
“aa bb”
?然后你能提供一个输入和预期输出的例子吗?现在还不太清楚你到底想实现什么。嗯,谢谢你这么做。但是我需要排除“-”先出现的情况,比如:“-a”、“-aa bb”等等,@user974594所以
“-aa bb”
不应该被分为
“aa bb”
?然后你能提供一个输入和预期输出的示例吗?你实际上想实现什么还不太清楚。