我正在尝试学习正则表达式,并尝试使用正则表达式将字符串中的值替换为空格,以将其提供给标记生成器。该字符串可能包含许多标点符号。但是,我不想替换字符串中包含撇号/连字符的空格。
例如,
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
但是,我无法排除连字符和撇号。
我的猜测是上面的正则表达式也很麻烦,应该有更好的方法。有没有?
所以,我所要做的就是:
感谢任何帮助。
答案 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)
答案 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}
匹配除了这两个'
或-
之外的所有标点符号。它不会触及匹配的[-']
符号(即,在开头和结尾)。