172

How do I write a regex to match any string that doesn't meet a particular pattern? I'm faced with a situation where I have to match an (A and ~B) pattern.

4

8 に答える 8

194

先読みアサーションを使用できます。

(?!999)\d{3}

この例は、 以外の 3 桁の数字に一致し999ます。


しかし、たまたまこの機能を備えた正規表現を実装していない場合 (「正規表現のフレーバーの比較」を参照)、基本的な機能を備えた正規表現を独自に作成する必要があります。

基本構文のみの互換性のある正規表現は次のようになります。

[0-8]\d\d|\d[0-8]\d|\d\d[0-8]

これは、 ではない 3 桁のシーケンスにも一致します999

于 2009-03-04T18:41:03.380 に答える
30

文字列内の単語 A に一致させ、単語 B には一致させたくない場合。例: テキストがある場合:

1. I have a two pets - dog and a cat
2. I have a pet - dog

ペットとして犬を飼っていて、猫を飼っていないテキスト行を検索する場合は、次の正規表現を使用できます。

^(?=.*?\bdog\b)((?!cat).)*$

2 行目のみが検索されます。

2. I have a pet - dog
于 2013-02-21T11:26:16.957 に答える
15

パターンと照合し、ホスト言語を使用して一致のブール結果を反転します。これにより、はるかに読みやすく、保守しやすくなります。

于 2009-03-04T18:48:29.823 に答える
8

そうではなく、言及されていない簡単な解決策があったため、この古くからの質問を復活させます。(正規表現バウンティクエストの調査中にあなたの質問を見つけました。)

(A and ~B) パターンを一致させなければならない状況に直面しています。

このための基本的な正規表現は驚くほど単純です。B|(A)

全体的な一致を無視して、A を含むグループ 1 のキャプチャを調べるだけです。

例 (正規表現での html の解析に関するすべての免責事項を含む): A は数字、B は以下の数字です。<a tag

正規表現:<a.*?<\/a>|(\d+)

デモ(右下のペインのグループ 1 を見てください)

参照

状況 s1、s2、s3 以外でパターンを一致させる方法

パターンを一致させる方法...

于 2014-05-13T21:51:42.467 に答える
4

通常の言語の補語も通常の言語ですが、それを構築するには、通常の言語のDFAを構築し、有効な状態をエラーに変更する必要があります。例については、これを参照してください。ページが言っていないのは、それが に変換さ/(ac|bd)/れたということ/(a[^c]?|b[^d]?|[^ab])/です。DFA から正規表現への変換は簡単ではありません。前に提案したように、正規表現をそのまま使用し、コードのセマンティクスを変更できると簡単です。

于 2009-03-04T19:11:16.040 に答える
2

パターン - レ

str.split(/re/g) 

パターンを除くすべてを返します。

ここでテスト

于 2009-03-05T02:26:17.787 に答える
0

ここでの私の答えは、あなたの問題も解決するかもしれません:

https://stackoverflow.com/a/27967674/543814

  • Replace の代わりに、Match を使用します。
  • group の代わりに、 group$1と読みます$2
  • グループ$2はそこで非キャプチャになりましたが、これは避けるべきです。

例:

Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");

最初のキャプチャ グループは、回避したいパターンを指定します。最後のキャプチャ グループは、他のすべてをキャプチャします。そのグループを読み上げるだけ$2です。

于 2015-01-15T16:11:00.943 に答える
0
(B)|(A)

次に、グループ2のキャプチャを使用します...

于 2009-03-05T02:29:28.200 に答える