19

文字列内にないキーワードを探すにはどうすればよいですか。

たとえば、次のテキストがあるとします。

こんにちは、このテキストは例です。

bla bla bla "このテキストは文字列の中にあります"

"random string" more text bla bla bla "foo"

textにないすべての単語を一致させたいと思います" "。他の私は一致したいと思います:

ここに画像の説明を入力

文字列内にあるため、赤で強調表示されているテキストと一致させたくないことに注意してください


考えられる解決策:

私はそれに取り組んできましたが、これは私がこれまでに持っているものです:

(?s)((?<q>")|text)(?(q).*?"|)

正規表現は if ステートメントを次のように使用することに注意してください: (?(述語) true 代替|false 代替)

したがって、正規表現は次のようになります。

" またはテキストを検索します。" が見つかった場合は、再び " (.*?") が見つかるまで選択を続けます。テキストが見つかった場合は何もしません...

その正規表現を実行すると、文字列全体が一致します。学習のためにこの質問をしています。すべての文字列を削除して、必要なものを探すことができることを知っています。

4

4 に答える 4

25

ここに1つの答えがあります:

(?<=^([^"]|"[^"]*")*)text

これの意味は:

(?<=       # preceded by...
^          # the start of the string, then
([^"]      # either not a quote character
|"[^"]*"   # or a full string
)*         # as many times as you want
)
text       # then the text

これを簡単に拡張して、エスケープを含む文字列も処理できます。

C# コードの場合:

Regex.Match("bla bla bla \"this text is inside a string\"",
            "(?<=^([^\"]|\"[^\"]*\")*)text", RegexOptions.ExplicitCapture);

コメント ディスカッションから追加 - 拡張バージョン (行ごとに一致し、エスケープを処理します)。これに使用RegexOptions.Multilineします:

(?<=^([^"\r\n]|"([^"\\\r\n]|\\.)*")*)text

C# 文字列では、次のようになります。

"(?<=^([^\"\r\n]|\"([^\"\\\\\r\n]|\\\\.)*\")*)text"

**ここの代わりに使用したいので"、そのためのバージョンがあります:

(?<=^([^*\r\n]|\*(?!\*)|\*\*([^*\\\r\n]|\\.|\*(?!\*))*\*\*)*)text

説明:

(?<=       # preceded by
^          # start of line
 (         # either
 [^*\r\n]| #  not a star or line break
 \*(?!\*)| #  or a single star (star not followed by another star)
  \*\*     #  or 2 stars, followed by...
   ([^*\\\r\n] # either: not a star or a backslash or a linebreak
   |\\.        # or an escaped char
   |\*(?!\*)   # or a single star
   )*          # as many times as you want
  \*\*     # ended with 2 stars
 )*        # as many times as you want
)
text      # then the text

このバージョンには文字が含まれていない"ため、リテラル文字列を使用する方がクリーンです。

@"(?<=^([^*\r\n]|\*(?!\*)|\*\*([^*\\\r\n]|\\.|\*(?!\*))*\*\*)*)text"
于 2012-07-23T21:01:37.293 に答える
7

これはかなりトリッキーになる可能性がありますが、一致するテキストと文字列の末尾の間に偶数の引用符があることを確認することで機能する可能性のある方法の 1 つを次に示します。

text(?=[^"]*(?:"[^"]*"[^"]*)*$)

text一致させたい正規表現に置き換えます。

ルビュラー: http://www.rubular.com/r/cut5SeWxyK

説明:

text            # match the literal characters 'text'
(?=             # start lookahead
   [^"]*          # match any number of non-quote characters
   (?:            # start non-capturing group, repeated zero or more times
      "[^"]*"       # one quoted portion of text
      [^"]*         # any number of non-quote characters
   )*             # end non-capturing group
   $              # match end of the string
)               # end lookahead
于 2012-07-23T20:56:50.257 に答える
1

次のように、非キャプチャ グループ内の引用符で囲まれたテキストを貪欲に一致させてそれらを除外し、引用されていない回答にキャプチャ グループを使用します。

".*(?:text).*"|(text)

単語の境界などを少し調整したい場合があります。しかし、これは目的の場所に到達し、明確に読みやすいサンプルになるはずです。

于 2012-07-23T21:04:57.010 に答える