正则表达式删除所有短于n的单词

时间:2009-09-26 00:07:01

标签: java regex

好吧,我正在寻找Java中的regexp,删除所有短于3个字符的单词。 我认为像\s\w{1,2}\s之类的东西会抓住所有的1和2个字母单词(一个空格,一到两个单词字符和另一个空格),但它只是不起作用。 我哪里错了?

4 个答案:

答案 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

对我而言,这是最简单的方法。为什么尝试匹配你不想要的东西,什么时候你可以更容易地匹配你想要的东西?没有双重空间,没有剩菜,标点符号在您的控制之下。其他方法在多个空间中突破并且不是很稳健。