删除短于n的单词,无论内部是否有连字符

时间:2017-02-25 16:57:17

标签: java regex hyphen

我想删除少于4个字符的单词,无论是否有连字符。我的意思是:

保持:

“Royaume-Uni”

“AB-CD”

“AB-C”

删除:

“A-B”

“ABC”

“AB - ”

我使用正则表达式执行此操作:replaceAll("\\b[\\w]{1,3}\\b","");

但是对于“Royaume-Uni”,例如它给出了:“Royaume-”并删除“Uni”。我想保留整个词。

如何删除少于4个字符的单词(连字符被视为一个字符)并让完整的其他字符?

5 个答案:

答案 0 :(得分:0)

如果你在比赛前后也要注意可选的连字符:

replaceAll("[-]*\\b[\\w]{1,3}\\b[-]*"," ");

https://www.regex101.com/r/eF5n3C/1

另一方面,如果你想匹配少于4个字符但没有前导和前导连字符的所有单词,你应该在前后添加一个正则表达式。

答案 1 :(得分:0)

您可以使用类似(简单)

的内容
replaceAll("\\b-?\\w{1,3}\\b", " ");

DEMO

答案 2 :(得分:0)

将wordboundaries替换为否定lookarround,因为短划线-和字母之间存在wordbound。

(?<![\\w-])\\w{1,3}(?![\\w-])

(?<![\\w-])表示之前没有-或单词字符。
(?![\\w-])表示之后没有-或单词字符。

答案 3 :(得分:0)

\b代表

的地方
  • 在字母数字(包括_)和非字母数字字符之间
  • 在字符串的开头或结尾

因此,如果-U匹配代表的位置(|-|U。如果您想根据空格和非空格字符进行搜索,则无法使用\b。相反,您需要使用{/ 3>}机制,如

  • (?<=\s|^)检查你的单词是否有空格或字符串开头,
  • (?=\s|$)检查你的单词后面是否有空格或字符串结尾。

同时将-视为{1,3}字符使用字符集的一部分,该字符集将是\w-的总和,可以表示为[\w-] (通常-是字符类中的特殊字符,因为它可以用于创建像a-z这样的字符范围,但由于它不能用于表示这样的范围,所以我们不会需要逃避它。)

所以你的解决方案看起来像:

replaceAll("(?<=\\s|^)[\\w-]{1,3}(?=\\s|$)","");

答案 4 :(得分:0)

试试这个正则表达式

(?<=^|[^\w-])[\w-]{1,3}(?=[^\w-]|$)

请参阅live demo

基本上\b是没用的,因为破折号然后空格不是\b。相反,使用环顾四周断言上一个/下一个字符不是你的连字符字符#34;或者是输入的开始/结束。