Java 更正现有正则表达式/创建新正则表达式
我试图学习正则表达式,并尝试使用正则表达式将字符串中的值替换为空格,以将其输入到标记器中。字符串可能包含许多标点符号。但是,我不想替换字符串中包含撇号/连字符的空格 比如说,Java 更正现有正则表达式/创建新正则表达式,java,regex,string,Java,Regex,String,我试图学习正则表达式,并尝试使用正则表达式将字符串中的值替换为空格,以将其输入到标记器中。字符串可能包含许多标点符号。但是,我不想替换字符串中包含撇号/连字符的空格 比如说, six-pack=>six-pack 他是 这个,那个=>这个,那个 起初我试图用空格替换所有的标点符号,但那不起作用。 我试图通过指定单词边界来替换那些标点符号,如中所示 \B[^\p{L}\p{N}\s]+\B}\B[^\p{L}\p{N}\s]+\B}\B[^\p{L}\p{N}\s]+\B 但是,我不能从中排除
six-pack=>six-pack
他是
这个,那个=>这个,那个
起初我试图用空格替换所有的标点符号,但那不起作用。
我试图通过指定单词边界来替换那些标点符号,如中所示
\B[^\p{L}\p{N}\s]+\B}\B[^\p{L}\p{N}\s]+\B}\B[^\p{L}\p{N}\s]+\B
但是,我不能从中排除连字符和撇号
我猜上面的正则表达式也很麻烦,应该有更好的方法。有吗
所以,我想做的就是:
非常感谢您的帮助。您可以使用此基于前瞻性的正则表达式:
(?!(?!^)['-])\\p{Punct}
您可能可以计算出一组单词之间的标点符号,而另一组单词之间的标点符号则不确定,然后在此基础上定义正则表达式 例如:
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)", " "));
}
注意
在这里,我使用一个字符类来定义
模式
,该字符类包含标点符号的所有posix,前后跟一个单词字符,但对包含'
或-
的字符类求反,您可以使用如下的负前瞻断言
String s = "six-pack\n"
+ "He's\n"
+ "This,that";
System.out.println(s.replaceAll("(?m)^['-]|['-]$|(?!['-])\\p{Punct}", " "));
输出:
6包
他是
这个那个
说明:
多行模式(?m)
匹配开头的^['-]
或'
-
或|
匹配行末尾的['-]$
或'
-
或|
匹配除这两个(?!['-])\\p{Punct}
或
之外的所有标点。它不会接触匹配的-
符号(即,在开始和结束处)[-']
您可能可以计算出一组单词之间的标点字符,而另一组单词之间的标点字符则不合格,然后在此基础上定义正则表达式。但是,这并不能解决字符串包含标点字符作为单独单词(如“this-that”)的情况是的,OP确实需要澄清这一点,但在这种情况下,您尝试在sentence@Flash:查看我的演示,看看您是否能在regex101.com上生成此正则表达式失败的案例