3

否定、補完、反転など、どのように呼ばれているのかわかりません。コンセプトはこうです。たとえば、アルファベット「ab」を持つ

R = 'a'
!R = the regexp that matche everyhting exept what R matches

この簡単な例では、次のようになります

!R = 'b*|[ab][ab]+'

そのような正規表現はどのように呼ばれますか? それを計算する方法があることを私の研究から覚えていますが、それは複雑で、一般的に手で作るのは難しすぎます. それを行うための優れたオンライン ツール (または通常のソフトウェア) はありますか?

4

2 に答える 2

4

jbo5112 の答えは、実用的な助けになります。ただし、理論的な側面では、正規表現は正規言語に対応するため、探している用語は補完です。

正規表現を補完するには:

  1. 同等の NFA に変換します。これはよく知られた定義済みのプロセスです。
  2. パワーセット構築を介して NFA を DFA に変換します
  3. 受け入れ状態を受け入れないようにすることで、DFA を補完します。
  4. DFAを正規表現に変換します。

これで、元の正規表現の補数が得られました!

于 2013-06-11T23:48:01.313 に答える
3

検索だけを行っている場合、正規表現の一部のソフトウェア/言語には、組み込みの一致を無効にする方法があります。たとえば、grep では、「-v」オプションを使用して、一致しない行を取得し、私が見た SQL バリアントでは、「not」修飾子を使用して一致を否定できます。

一部/ほとんど/すべての正規表現方言がサポートする別のオプションは、「否定先読み」を使用することです。特定の構文を調べる必要があるかもしれませんが、これは興味深いツールであり、読む価値があります。一般的には、次のようなものです: if R='<regex>', then Negative_of_R='(?!<regex>)'. 残念ながら、言語の特性によって異なる場合があります (例: vim uses \(<regex>\)\@!)。

注意: 注意しないと、否定された正規表現が予想以上に一致する可能性があります。テキストがThis doesn't match 'mystring'.あり、 を検索すると(?!mystring)、mystring の「m」以外のすべてに一致します。

于 2012-09-19T05:59:56.223 に答える