2016-05-29 3 views
1

"like"という単語が "crusegdf"の前に来る特定の行を見つけようとしています。たとえば、次の入力があるとします。regex、単語がその中にある場合は、行を避けてください

def shared temp-table w-cruseg no-undo field cruise-id like crusegdf.segment-id 
define {1} shared temp-table tt-history no-undo like crusegdf. 

私は2行目と一致します。しかし、私の正規表現はこれらの両方の行を見つけます。私は今使用正規表現は次のとおりです。

(?i)(define|def)(.*?)(temp-table)(.*?)(like)\s*(\bcrusegdf\b)\s*(\.) 
+0

*ネガティブなlookbehind *? –

+1

どのプログラミング言語を使用していますか? –

+0

「フィールド」の値が「好き」、「好き」が「フィールド」の場合に、正規表現がそのデータを解析する最も良い方法であるかどうかはわかりません。 –

答えて

1

あなたの入力はドットが含まれているフィールド名を持っているので、あなたは、自分のフィールド名を区切るために\bを使用することはできません。ドットは「単語」文字ではありません。

代わりにドットのために先に、より多くのフィールド名負の外観を使用します。

^(?i)(define|def).*?temp-table.*?like\s*\bcrusegdf\b(?!\.\w).*$ 

live demoを参照してください。

不要な角括弧も削除しました(あなたの質問では、入力をキャプチャする必要はありません)。

+0

ご協力ありがとうございます。実際に私はそれが私が言及した方法が欲しい。それは特別なケースであり、私は多くのことがあるので、すべての条件を言及していない。私は2つの異なる正規表現を使用して両方のケースを見つける必要があります。 1つは行内に「フィールド」があり、もう1つは行内に「フィールド」がありません。私がそれらをキャプチャしているので、他のすべての括弧も必要です。 – user1877031

0

あなたはそれの前defineが含まれていませんlikeを含むように一致させるために、この負の先読み正規表現を使用することができます。

^(?:(?!\bfield\b).)*like.* 

RegEx Demo

(?:(?!\bfield\b).)*ない0以上の任意の文字にマッチします次の位置にfieldがある。

+0

また、「temp-table」という単語がその行にあることを確認する必要があります。どうすればいいですか? – user1877031

+0

その場合、 '^(?=。* temp-table)(?:(?!bfield \ b)))* like。*' – anubhava

関連する問題