4

指定された文字列の引用符の内容と一致する必要がある構成ファイルのスニペットがありますが、コメントアウトされていない場合のみ、現在の正規表現は次のとおりです。

(?<!=#)test\.this\.regex\s+\"(.*?)\"

私はこれがうまくいくべきだと思いますか?私は次のように読みました。

(?<!=#)後読みして、前に#

test\.this\.regex\s+\"(.*?)\"マッチtest.this.regex "sup1"

ここに設定スニペットがあります

    test.this.regex "sup1" hi |sup1| # test.this.regex "sup3" hi |sup3|
# test.this.regex "sup2" do |sup2|
    test.this.regex "sup2" do |sup2|

しかし、私の正規表現は4回すべて一致します:

Match 1
1.  sup1
Match 2
1.  sup3
Match 3
1.  sup2
Match 4
1.  sup2
4

2 に答える 2

0

次の PCRE 正規表現を使用できます。

/(?># *(*SKIP)(*FAIL)|(?:^|\s))test\.this\.regex\s+\"[^"]*\"/

ワーキングデモ

  • (*FAIL)失敗した否定的なアサーションのように動作し、の同義語です(?!)
  • (*SKIP)サブパターンが後で失敗したときに正規表現エンジンがバックトラックを許可されないポイントを定義します
  • (*SKIP)(*FAIL)一緒に、上記の正規表現で可変長の lookbehinf を使用できないという制限の優れた代替手段を提供します。

更新: ruby​​ がサポートしているかどうかわからない(*SKIP)(*FAIL)ので、この代替バージョンを提供します:

(?:# *test\.this\.regex\s+\"[^"]*\"|\b(test\.this\.regex\s+\"[^"]*\"))

空でない一致したグループ #1 を探します。

作業デモ 2

于 2014-05-17T05:24:08.677 に答える
0

質問が最初の文で具現化されている場合 (特にルックアラウンドについてではありません) 、後読みを除いた正規表現でString#splitを使用しないのはなぜですか?

def doit(str)
  r = /test\.this\.regex\s+\"(.*?)\"/
  str.split('#').first[r,1]
end

doit('test.this.regex "sup1" hi |sup1| # test.this.regex "sup3" hi |sup3|')
  #=> "sup1"
doit('# test.this.regex "sup2" do |sup2|')
  #=> nil
doit('test.this.regex "sup2" do |sup2|')
  #=> "sup2"
于 2014-05-17T19:01:40.917 に答える