Java正则表达式来匹配破折号的精确数目

Java正则表达式来匹配破折号的精确数目,java,regex,Java,Regex,在类似标记的文本中,我想用emdash实体替换三个破折号(--),但我不想替换四个破折号 我怎样才能把它写成正则表达式 我试过这个: String input = "--- This---example----and--another.---"; String expected = "— This—example----and--another.—"; assertEquals(expected, input.replaceAll("-

在类似标记的文本中,我想用emdash实体替换三个破折号(
--
),但我不想替换四个破折号

我怎样才能把它写成正则表达式

我试过这个:

String input = "--- This---example----and--another.---";
String expected = "— This—example----and--another.—";
assertEquals(expected, input.replaceAll("-{3}", "—"));
但它给了我:

— This—example—-and--another.— — 这—;例如—-以及"另一个"; 而不是我想要的:

— This—example----and--another.— — 这—;例如——还有——另一个;
我希望在一行的开头或结尾出现三个破折号时,或与任何周围字符(破折号除外)一起出现时,也就是说,不只是在被字母数字包围时,它才起作用。

使用lookarounds确保只有三个破折号匹配:

input.replaceAll("(?<!-)-{3}(?!-)", "&#8212;")

input.replaceAll((?您可以告诉它,3个破折号周围的字符不能是另一个:


replaceAll(“[^-]-{3}[^-]”,…)

这也将匹配前面和后面的字符,因此它不能在替换上下文中使用。这(1)要求在
-
周围存在非破折号,因此如果将
-
放在字符串的开头或结尾,它将失败,(2)还将删除周围可能导致其他问题的非破折号,例如在
a--b--c
的情况下,
b
将与
a--b
一起删除,因此它将阻止您再次使用它来匹配
b--c
。哦,天哪,我甚至不知道那些零宽度的前向/后向结构。非常感谢!