涉及正面lookbehind和lookahead的java正则表达式

时间:2016-03-21 22:41:11

标签: java regex

我试图找出一个正则表达式来查找<ANYTHING_BUT_WHITSPACE>??<ANYTHING_BUT_WHITSPACE>并替换?有空白。

所以, &#39;?测试?&#39;应该成为测试测试&#39;

以下是我提出的正则表达式;但似乎没有用。有什么建议吗?

s.replace("(?<=/S)?|?(?=/S)", "");
  • (?&LT = / S)?寻找 ?除了空白(\ S)
  • 之外的任何东西都有正面的后视
  • |或
  • ?(?= / S)寻找?除了空白(\ S)
  • 之外的任何东西都是积极的前瞻

3 个答案:

答案 0 :(得分:1)

首先,你的正则表达式有一些错误。您使用/代替\。第二件事是逃避角色。

您要查找的正则表达式为(?<=\S)\?|\?(?=\S),并替换为empty  字符串。

注意:对于Java,请使用双重转义,即\\S\\?

Regex101 Demo

答案 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