2

さて、「foo bar」というフレーズがあり、「foo bar」以外のすべてを検索したいと思います。
これが私のテキストです。

ipsum dolor foo bar Lorem ipsum dolor sit amet,
consectetur adipisicing elit, sed do
eiusmod tempor foo bar incididunt ut labe et
dolore foo bar

これを正規表現内で行う方法はありますか?文字列などを使用する必要はありませんか?

結果:

注: うまく強調表示することはできませんが、太字でアイデアが得られます (ただし、前後のスペースも選択されますが、太字が壊れます)。

ipsum dolor foo bar Lorem ipsum dolor sit amet,
consectetur adipisicing elit, sed do
eiusmod tempor foo bar incididunt ut labe et
dolore foo bar

PCRE命名法を仮定します。


UPDATE 7/29/2013: 選択した言語で検索と置換機能を使用して、不要なフレーズを「削除」し、必要な情報が残るようにすることをお勧めします。

4

6 に答える 6

9

一般に、 iffoobarはそれ自体に一致し、 then(?s:(?!foobar).)*は ではない foobarものすべてに一致し、何も含まれていません。

foobarそれを使用して、たとえば、次のように使用して、含まれていない行を見つけることができます

^(?:(?!foobar).)*$

言語のsplit()関数を使用して分割する こともできます。これにより、分割パターンを含まないfoobarすべての部分が得られます。

(*FAIL)やのような厄介であまり知られていないバックトラッキング制御動詞に関しては(*COMMIT)、「おもちゃではない」プログラムでそれらを使用する機会はまだあまりありません。(?>...)独立した部分式 viaと所有量指定子*+、などは++?+いわば十分なロープ以上のものを与えてくれることがわかりました。

(*FAIL)とはいえ、この回答にはおもちゃの使用例が 1 つあります。これは最初の正規表現ソリューションです。これが存在する理由は、正規表現エンジンに考えられるすべての順列を強制的にバックトラックさせたかったからです。本当の目的は、単に試行した方法の数を数えることでした。

そこにある私の 2 つの正規表現は、他の人からの非常に多くの信じられないほど創造的な回答とともに、すべて楽しく、皮肉なことを意図していることを理解してください。それでも、ショックから立ち直れば、彼らから多くのことを学ぶことができます。☺</p>

于 2010-11-06T02:31:28.440 に答える
4

試す

^(?!.*foo bar).*$

これにより、「foo bar」を含まないすべての行が選択されます。(?! = 否定先読み)

于 2010-11-16T15:41:09.460 に答える
2

「foo バー以外のすべてを削除する」は、「foo バーのみを検索する」と同等であり、PCRE ではこれを非常に簡単に行うことができます。逆に言えば、「foo bar 以外のすべてを検索する」は、「foo bar のみを検索して削除する」ことと同じです。そのため、補完はツールから簡単に行うことができます。

それとは別に、PCREには、*FAIL遭遇するとすぐにバックトラックを引き起こすとして知られている厄介な小さな機能があります。(*COMMIT)foo bar(*FAIL)したがって、正規表現に次のようなものを挿入すると役立つと思います。ただし、友好的でも安全でもありません。

于 2010-11-05T19:13:47.863 に答える
1

ここ:perl -pe 's{.*?(foo bar)?}{$1}g' <text

「foo bar」以外のすべてを見つけたい

$1 による置換を使用しない一致のみのパターン (s{pattern}{} のように空の置換で使用可能)...それが可能かどうかはわかりません。まで char をむさぼり食う必要がありfoo barます.*?(?=foo bar)。しかしその後、マッチング アルゴリズムは続行し、"oo bar" を検出し、f がないため再びマッチングします。

クエストを続けると、要求された部分をむさぼり食う perl コードの一部を次に示します。ただし、foo barたまたま行頭にある場合に空のキャプチャが返される可能性があるという欠点があります。

foreach (<>) {
        チョップ;
        @_ = m{(.*?)(?:foo bar|$)}gs;
        @_ に対して "[[ $_ ]]\n" を出力します。
}

関連する置換はなく、これを Lorem ipsum テスト ファイルで実行すると、foo barパーツ以外のすべてが表示されます。PCRE と互換性がありますが、$EDITOR が想定どおりに動作するという保証はありません。

于 2010-11-21T21:15:40.087 に答える
1

では、UltraEdit の「高度な」(Perl 正規表現スタイル) 検索機能を使用する以外のすべてを削除します。これを行う最も簡単な方法は、すべてを一致させることですが、次のようにキャプチャfoo barのみを行います。 foo bar

(?:(?!foo bar).)+(foo bar|$)

$1...それをorに置き換えます\1(UltraEdit が受け入れるスタイル)。

UltraEdit は使用しませんが、EditPadPro では次のように変換されます。

ipsum dolor foo bar Lorem ipsum dolor sit amet,
consectetur adipisicing elit, sed do
eiusmod tempor foo bar incididunt ut labore et
dolore foo bar 

...これに:

foo bar

foo bar
foo bar

...これは、元のメッセージで示した結果です。

于 2010-11-18T00:38:29.880 に答える