不管里面是否有连字符,都删除短于 n 的单词

Remove words shorter than n whatever if there is an hyphen inside or not

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

保持:

"Royaume-Uni"

"ab-cd"

"ab-c"

删除:

"a-b"

"abc"

"ab-"

我用正则表达式来做这个:replaceAll("\b[\w]{1,3}\b","");

但对于 "Royaume-Uni" 例如它给出:"Royaume-" 并删除 "Uni"。我想保留整个单词。

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

如果您还要注意匹配前后的可选连字符:

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

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

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

你可以使用这样的东西(简单) :

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

DEMO

将单词边界替换为负数 lookarround,因为破折号 - 和字母之间有一个单词边界。

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

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

\b代表的地方是

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

所以在 -U 的情况下,它匹配代表的地方(由 |-|U。如果您想根据白色space 和非白色space 字符进行搜索,那么您不能使用\b。相反,您需要使用 look around 机制,例如

  • (?<=\s|^) 检查您的单词是否有 space 或它之前的字符串开头,
  • (?=\s|$) 检查您的单词是否有 space 或后面的字符串结尾。

还要将 - 视为 {1,3} 字符的一部分,使用字符集是 \w- 的总和,可以表示为 [\w-] (通常 - 是字符 class 内的特殊字符,因为它可以用来创建字符范围,例如 a-z 但由于它不能在这里用来表示这样的范围,我们不'需要转义它)。

因此您的解决方案可能如下所示:

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

试试这个正则表达式

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

live demo

本质上\b是没有用的,因为dash-then-space不是\b。相反,使用环顾四周来断言 previous/next 字符不是您的 "hyphenated word chars",或者是输入的 start/end。