2016-06-17 5 views
3

フレーズの先頭にある特定の部分式に一致する文字列を見つけるのにlookaheadを使用しようとしていますが、特定の部分式の後部には一致しません。ルックアヘッドでのR正規表現の貪欲

例えば、私はこの

temp <- c("hello_i_am_in_the_park", "hey, park your car here") 
grep("h.*park.*(?!here)", temp, perl=T,value=T) 

を返すようにしたい:

[1] "hello_i_am_in_the_park" 

をしかし、代わりに私が手:

[1] "hello_i_am_in_the_park" "hey, park your car here" 

私は、これは非貪欲とは何かであると仮定。*しかし、より貪欲にするために式を修正する方法を理解していないようです。

答えて

4

あなたは先読みに.*を配置する必要があります。

h.*park(?!.*here) 
      ^^ 

は、この正規表現は、このように動作しますregex demo

を参照してください:

  • h - ^で最初h(前付加と一致しました文字列の先頭に一致させる)
  • .*から
  • park(これはPCRE正規表現であるため、.は、デフォルトでは改行文字と一致しない)改行以外の0+文字にマッチします - 一致した場合に失敗否定先読み - リテラルpark
  • (?!.*here)と一致します改行以外に0文字以上があり、その後にはhere部分文字列が続きます。

テキストは改行を持っている、と言葉herepark、下記の別の行に配置することができる、あなたはインライン修飾子(?s)を追加する必要がある場合:

"(?s)h.*park(?!.*here)" 

代替正規表現を行うことであろう文字列の先頭ですぐに確認してください。

^(?!.*here)h.*park 

regex demoを参照してください。このようにして、禁止された部分文字列をすばやく確認し、存在しない場合はh.*およびparkを検索しません。

そして最後にではなく、少なくとも:

"^(?!.*\\bhere\\b)h.*\\bpark\\b" 
+1

おかげWiktor第あなたの包括的な答え:あなたは単語全体を一致させる必要がある場合のみ、\b単語の境界を追加することを忘れないでください –

関連する問題