我试图找出一个正则表达式来查找<ANYTHING_BUT_WHITSPACE>?
或?<ANYTHING_BUT_WHITSPACE>
并替换?有空白。
所以, &#39;?测试?&#39;应该成为测试测试&#39;
以下是我提出的正则表达式;但似乎没有用。有什么建议吗?
s.replace("(?<=/S)?|?(?=/S)", "");
答案 0 :(得分:1)
首先,你的正则表达式有一些错误。您使用/
代替\
。第二件事是逃避角色。
您要查找的正则表达式为(?<=\S)\?|\?(?=\S)
,并替换为empty
字符串。
注意:对于Java,请使用双重转义,即\\S
和\\?
。
答案 1 :(得分:0)
首先,?
作为文字需要进行转义,因为它是特殊的正则表达式字符(\\?
而不是?
)。
您应该使用replaceAll
代替replace
来替换使用正则表达式。
还要确保将replaceAll
的返回值重新分配给字符串,因为字符串在Java中是不可变的。
非空白预定义字符组为\S
而非/S
。
答案 2 :(得分:0)
如果在正则表达式中用作文字,我认为你需要逃避问号 表达式,因为它是元字符。
所以,这可能是你需要的
(?:
(?<! \s )
\?
|
\?
(?! \s )
)
但是,它可能看起来不直观,但使用带有前导的表达式 断言大大减慢了发动机的速度。
要获得更好的结果,请首先匹配文字,然后检查断言。
\?
(?:
(?! \s )
| (?<! \s \? )
)
让我们使用Benchmark软件比较相对表现。
输入
wrgasgsagasf?afbafbadfbadfbadfbafdb
dddd? asfbasbfasfb
?asvgasgasgasgasg
替补席
Regex1: \?(?:(?!\s)|(?<!\s\?))
Options: < none >
Completed iterations: 50 / 50 ( x 1000 )
Matches found per iteration: 3
Elapsed Time: 0.15 s, 154.76 ms, 154756 µs
Regex2: (?:(?<!\s)\?|\?(?!\s))
Options: < none >
Completed iterations: 50 / 50 ( x 1000 )
Matches found per iteration: 3
Elapsed Time: 0.89 s, 894.83 ms, 894834 µs