0

为什么在数据(d)上应用正则表达式(rx)会给出输出(o)?
正则表达式(rx):

s/(?<!\#include)[\s]*\<[\s]*([^\s\>]*)[\s]*\>/\<$1\>/g

数据(d):

#include  <a.h>  // 2 spaces after e

输出(o):

#include <a.h>  // 1 space is still there

预期输出为:

#include<a.h>  // no space after include

4

3 回答 3

6

(?<!\#include)只要您通过了两个空格中的第一个,条件就为真,因此比赛从那里开始。

#include  <a.h>
         ^^^^^^- matched by your regex.

这意味着您的替换操作不会删除空间。

如果您改用积极的后向断言,您将获得所需的结果:

s/(?<=#include)\s*<\s*([^\s>]*)\s*>/<$1>/g;

可以重写以使用更有效\K的:

s/#include\K\s*<\s*([^\s>]*)\s*>/<$1>/g;
于 2013-07-31T15:16:13.283 回答
2

?<!\#include)[\s]是一个不直接位于前面的空格#include。中的第一个空格#include <a.h>直接在前面#include,因此不匹配。第二个不是(它前面是另一个空格),所以这就是比赛开始的地方。

于 2013-07-31T15:17:00.823 回答
0

作为旁注,您可以使用不使用后视的这种模式:

s/(?:#include\K|\G)(?:\s+|(<|[^\s><]+))/$1/g

图案细节:

(?:              # open a non capturing group
    #include\K   # match "#include" and reset it from the match result
  |              # OR
    \G           # a contiguous match
)                # close the non capturing group
(?:          
    \s+          # white characters (spaces or tabs here) 
  |              # OR
    (            # capturing group
        <
      |
        [^\s><]+ # content inside brackets except spaces (and brackets)
    )
)

搜索在右括号处停止,因为它没有在模式中描述,并且在下一个之前没有更多的连续匹配#include

于 2013-07-31T16:31:42.643 回答