0

特定の部分文字列のセットを含まないすべてのものに一致する単一の正規表現を探していました。

たとえば、部分文字列「abc」、「def」、「ghi」を含まないすべてのものに一致する正規表現

この例では、正規表現は「student」、「apple」、「maria」には一致しますが、「definition」、「ghint」、「abc123」には一致しません。

前もって感謝します

4

3 に答える 3

1

それが、否定的な先読みアサーションを使用するものです。

^(?!.*(abc|def|ghi))

入力文字列に「悪い」単語が含まれていない限り、一致します。

先読みアサーション自体は何にも一致しないため、一致結果 (一致が成功した場合) は空の文字列になることに注意してください。

Python の場合:

>>> regex =  re.compile("^(?!.*(abc|def|ghi))")
>>> [bool(regex.match(s)) for s in ("student", "apple", "maria",
...                                 "definition", "ghint", "abc123")]
[True, True, True, False, False, False]
于 2013-10-10T20:37:07.540 に答える
1

先読みを使用できます。

^(?!.*?(?:abc|def|ghi)).*$
  • (?!...)と呼ばれるnegative lookahead
  • (?:...)を非捕捉群と呼びます。

正規表現リファレンス

于 2013-10-10T20:37:16.140 に答える
0

以下のような「禁止された」単語を含む文字列がある場合は、「

生徒 アップル マリア 定義 ghint abc123 右

そして、文字列に使用できるそれらが含まれているかどうかを知りたいだけです:

.*?(?!def|abc|ghi)

これにより、4つのマッチが得られます

  • d
  • g
  • a
  • g

それは禁句の最初の文字です ( * def *inition, * ghi *nt, * abc *123, ri* ghi *t )

文字列に一致するものが見つからない場合、「禁止」語はありません。

次を使用して regex.replace を使用することもできます。

\w*(abc|def|ghi)\w*

「禁止された」部分文字列を「」に置き換えて、禁止されていないすべての部分文字列を保持できるようにします。

于 2013-10-10T21:05:30.430 に答える