使用正则表达式替换标点符号并使用最少的单词长度

时间:2014-10-09 14:18:01

标签: java regex

我有许多String之类的:

String str = "camera+app,mountain,lord+kelvin,man,square+format,+-+,sea,e2";

我想创建一个新的String

  1. 将所有标点符号替换为单个空格和
  2. 这些单词也将大于或等于3个字符
  3. 所需的输出应为: camera app mountain lord kelvin man square format sea,所以我认为正则表达式可能会成功。

    我试过

    Pattern pattern = Pattern.compile("(?\\p{Punct})?([\\w]]{3,}*)(?\\p{Punct})?");
    Matcher matcher = pattern.matcher(str);
    int i = 1;
    if(matcher.matches()) {
        while(matcher.find()) {
            System.out.print(matcher.group(i++) + " ");
        }
    }
    

    显然无法正常工作(正如您对本文所期望的那样)。

    表达我的观点:

    • 我将(?\\p{Punct})?作为可选的非捕获标点符号
    • 然后([\\w]]{3,}*)应该捕获所需的子字符串和
    • 最终(?\\p{Punct})?是捕获以下标点符号。

    我想这不会照顾多个标点符号,但我想稍后再处理。

    我总是遇到一些正则表达式的麻烦,所以我有点卡住了。 当我在enter link description here导入我的正则表达式时,我得到一个特殊的错误(至少对我而言)Unknown inline modifier near index 2 \\

2 个答案:

答案 0 :(得分:2)

您的代码无效,因为您的正则表达式有问题。你可以使用这个正则表达式:

\p{Punct}*(\w{3,})\p{Punct}*

另请注意此更正后的代码

Pattern pattern = Pattern.compile("\\p{Punct}*(\\w{3,})\\p{Punct}*");
Matcher matcher = pattern.matcher(str);

while(matcher.find()) {
    System.out.print(matcher.group(1) + " ");
}

RegEx Demo

答案 1 :(得分:1)

如果我理解你的问题(来自你的输入/输出),你可以用一个单一空格的1+量词替换标点符号:

String str = "camera+app,mountain,lord+kelvin,man,square+format,+-+,sea";
System.out.println(str.replaceAll("\\p{Punct}+", " "));

修改(I)

如果要限制replaceAll所选单词的大小,可以使用以下顺序替换。请注意,这不是那么优雅,也不像单个替换那样好;

System.out.println(
    str.replaceAll("\\p{Punct}+|\\b\\w{1,2}\\b", " ").replaceAll("\\s+", " ")
);

<强>输出

camera app mountain lord kelvin man square format sea

备注

  • 由于你尝试的复杂性,我怀疑你错过了一些你想要的行为的规范......我的回答看起来太容易了!但是,确实会返回您想要的输出。
  • 您还可以将替换结果逐项列入array。例如:

    System.out.println(Arrays.toString(str.split("\\p{Punct}+")));
    

    编辑(II) 要在逐项列出元素时限制单词的大小,可以使用以下模式:

    System.out.println(
        Arrays.toString(str.split("(^|\\W+?)\\w{1,2}(\\W+?|$)|\\p{Punct}+"))
    );
    

    <强>输出

    [camera, app, mountain, lord, kelvin, man, square, format, sea]