不管里面是否有连字符,都删除短于 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", " ");
将单词边界替换为负数 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-]|$)
本质上\b
是没有用的,因为dash-then-space不是\b
。相反,使用环顾四周来断言 previous/next 字符不是您的 "hyphenated word chars",或者是输入的 start/end。
我想删除少于 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", " ");
将单词边界替换为负数 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-]|$)
本质上\b
是没有用的,因为dash-then-space不是\b
。相反,使用环顾四周来断言 previous/next 字符不是您的 "hyphenated word chars",或者是输入的 start/end。