我想删除少于4个字符的单词,无论是否有连字符。我的意思是:
保持:
“Royaume-Uni”
“AB-CD”
“AB-C”
删除:
“A-B”
“ABC”
“AB - ”
我使用正则表达式执行此操作:replaceAll("\\b[\\w]{1,3}\\b","")
;
但是对于“Royaume-Uni”,例如它给出了:“Royaume-”并删除“Uni”。我想保留整个词。
如何删除少于4个字符的单词(连字符被视为一个字符)并让完整的其他字符?
答案 0 :(得分:0)
如果你在比赛前后也要注意可选的连字符:
replaceAll("[-]*\\b[\\w]{1,3}\\b[-]*"," ");
https://www.regex101.com/r/eF5n3C/1
另一方面,如果你想匹配少于4个字符但没有前导和前导连字符的所有单词,你应该在前后添加一个正则表达式。
答案 1 :(得分:0)
答案 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;或者是输入的开始/结束。