纠正现有的正则表达式/创建一个新表达式

时间:2014-10-21 14:12:27

标签: java regex string

我正在尝试学习正则表达式,并尝试使用正则表达式将字符串中的值替换为空格,以将其提供给标记生成器。该字符串可能包含许多标点符号。但是,我不想替换字符串中包含撇号/连字符的空格。

例如,

six-pack => six-pack
He's => He's
This,that => This That

我试图用空格替换所有标点符号,但这不起作用。 我试图通过在

中指定wordboundaries来替换那些标点符号
\B[^\p{L}\p{N}\s]+\B|\b[^\p{L}\p{N}\s]+\B|\B[^\p{L}\p{N}\s]+\b

但是,我无法排除连字符和撇号。

我的猜测是上面的正则表达式也很麻烦,应该有更好的方法。有没有?

所以,我所要做的就是:

  1. 用空格替换所有标点符号
  2. 如果是连字符/撇号,请不要执行上述操作
  3. 如果连字符/撇号确实出现在单词的开头/结尾,请进行替换。
  4. 感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

你可以找出一组在单词之间可以正常的标点符号,另一组不是,然后根据它定义你的正则表达式。

例如:

String[] input = {
    "six-pack",//  => six-pack
    "He's",// => He's
    "This,that"// => This That"
};
for (String s: input) {
    System.out.println(s.replaceAll("(?<=\\w)[\\p{Punct}&&[^'-]](?=\\w)", " "));
}

<强>输出

six-pack
He's
This that

注意

这里我通过使用一个字符类来定义Pattern,该字符类包括用于标点符号的所有posix,前面和后面跟一个单词字符,但是否定包含'或{{}的字符类1}}。

答案 1 :(得分:0)

您可以使用这个基于前瞻性的正则表达式:

(?!((?!^)['-].))\\p{Punct}

RegEx Demo

答案 2 :(得分:0)

您可以使用下面的负向前瞻断言,

String s = "six-pack\n"
        + "He's\n"
        + "This,that";
System.out.println(s.replaceAll("(?m)^['-]|['-]$|(?!['-])\\p{Punct}", " "));

输出:

six-pack
He's
This that

<强>解释

  • (?m)多线模式
  • ^['-]匹配开头的'-
  • |
  • ['-]$匹配行尾的'-
  • |
  • (?!['-])\\p{Punct}匹配除了这两个'-之外的所有标点符号。它不会触及匹配的[-']符号(即,在开头和结尾)。

RegEx Demo