0

私は正規表現を初めて使用しますが、これに対する解決策を見つけることができませんでした。選択した2つの単語のいずれかがその文字列に存在する場合、その文字列を一致させたいと思いました。

私はこのように書いた

perl -e ' "text   -aborted" =~ m/(.*)-[failed aborted]/; print "\n\n$1\n\n";'

しかし、問題は、失敗または中止された文字のいずれかが文字列に存在する場合でも、一致していることです。

 perl -e ' "text   -fa" =~ m/(.*)-[failed aborted]/; print "\n\n$1\n\n";'

失敗または中止された完全一致のみを一致させたかったのですが、これを行う方法について誰か助けてください。

4

4 に答える 4

4

正規表現の角括弧[]は、ここで期待しているものとは異なる動作をします。これらは 1 文字に一致し、その文字は角括弧内の任意の文字にすることができます。たとえば、単一の小文字の母音に一致させたい場合は、次のようにできます。

m/[aeiou]/

あなたが探しているのは交代です。これは、「失敗」または「中止」という単語を検索します。

m/(failed|aborted)/

つまり、選択肢はそれぞれパイプ|で区切られ、括弧で囲まれています()。これらを連鎖させることもできます:

m/(many|different|acceptable|words)/
于 2013-02-18T10:51:59.610 に答える
3

このように交互に試してみてください

m/(.*)-(?:failed|aborted)/

シーケンスは(?:...)、括弧と同じ方法でアイテムをグループ化しますが、キャプチャを形成しません。

さらに、次を使用して末尾のスペースをキャプチャすることを避けることができます

m/(.*?)\s*-(?:failed|aborted)/

これは、貪欲でない量指定子 (追加の?) を使用して、パターンが一致する文字をできるだけ少なくできるようにします。

于 2013-02-18T10:51:29.087 に答える
1

[...]文字クラスを導入します。リストされている任意の文字がクラスに一致します。交代が必要です:

"text -aborted" =~ /(.*)-(?:failed|aborted)/
于 2013-02-18T10:51:21.987 に答える
1

角括弧は文字クラスを表します。つまり、(正しくお気づきのように) 角括弧内の文字の 1 つに一致する正規表現トークンです。

単純な代替( |) と非キャプチャ括弧 ( (?:...)) が必要です。

perl -e ' "text   -aborted" =~ m/(.*)-(?:failed|aborted)/; print "\n\n$1\n\n";'
于 2013-02-18T10:51:29.360 に答える