好吧,我正在寻找Java中的regexp,删除所有短于3个字符的单词。
我认为像\s\w{1,2}\s
之类的东西会抓住所有的1和2个字母单词(一个空格,一到两个单词字符和另一个空格),但它只是不起作用。
我哪里错了?
答案 0 :(得分:11)
我的工作相当不错,但需要两次通过。
public static void main(String[] args) {
String passage = "Well, I'm looking for a regexp in Java that deletes all words shorter than 3 characters.";
System.out.println(passage);
passage = passage.replaceAll("\\b[\\w']{1,2}\\b", "");
passage = passage.replaceAll("\\s{2,}", " ");
System.out.println(passage);
}
第一遍用一个空格替换包含少于三个字符的所有单词。请注意,我必须在字符类中包含撇号才能消除,因为“我是”这个词在没有它的情况下给了我麻烦。您可以在文本中找到其他特殊字符,这些字符也需要包含在此处。
第二次传球是必要的,因为第一次传球留下了几个有双倍空间的地方。这只会将所有出现的2个或更多空格折叠为1。这取决于你是否需要保留这个,但我认为空间崩溃会更好。
输出:
好吧,我正在寻找Java中的regexp,删除所有短于3个字符的单词。
好吧,正在寻找删除短于字符的所有单词的正则表达式。
答案 1 :(得分:3)
如果您不希望空格匹配,则可能需要使用
\b\w{1,2}\b
获得单词边界。
使用Java风格在RegexBuddy中为我工作;对于测试字符串
“这只狗很有趣”
它突出显示“是”和“a”。同样,对于一行开头/结尾的单词。
您可能希望发布代码示例。
(而且,正如GameFreak刚刚发布的那样,你仍会以双倍空格结束。)
编辑:
\b\w{1,2}\b\s?
是另一种选择。这将部分解决空间剥离问题,尽管字符串末尾或后跟标点符号的单词仍然可能导致问题。例如,“狗很有趣吗?”成为“狗的乐趣?”在任何情况下,你仍然会遇到大写问题(狗现在应该是狗)。
答案 2 :(得分:1)
尝试:\b\w{1,2}\b
虽然您仍然需要摆脱将出现的双倍空格。
答案 3 :(得分:1)
如果您有这样的字符串:
hello there my this is a short word
此正则表达式将匹配字符串中长度大于或等于3个字符的所有单词:
\w{3,}
导致:
hello there this short word
对我而言,这是最简单的方法。为什么尝试匹配你不想要的东西,什么时候你可以更容易地匹配你想要的东西?没有双重空间,没有剩菜,标点符号在您的控制之下。其他方法在多个空间中突破并且不是很稳健。