0

data(d) に正規表現(rx) を適用すると output(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

2 つのスペースのうち最初のスペースを通過するとすぐに条件(?<!\#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あるため、一致しません。2 つ目はそうではない (他のスペースが前にある) ため、そこから一致が開始されます。

于 2013-07-31T15:17:00.823 に答える