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

时间:2017-01-20 15:17:18

标签: java regex

在类似Markdown的文字中,我想用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.—

我想让它在一行的开头或结尾出现三个短划线或任何周围的字符(除了破折号)-i.e时工作。不仅仅是在被字母数字包围的时候。

2 个答案:

答案 0 :(得分:6)

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

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

请参阅regex demo

(?<!-) 否定后瞻一旦{3}破折前-(?!-) 负前瞻如果在3个短划线之后有-,则会使比赛失败。

答案 1 :(得分:-1)

你可以告诉它3个破折号周围的角色不能再是另一个角色:

replaceAll("[^-]-{3}[^-]", ...)