2016-05-12 8 views
-2

与えられた文字列を含む単語を探したい。しかし、その言葉は、禁止されている単語とは異なるはずです。 で例えば与えられたシーケンスを含み、特定の単語を除いた正規表現を見つける正規表現

「モーダルダラマンodalモーダルODALアモーダルmodalex amodale」 シーケンスは「DAL」で、禁止された単語がモーダルである場合、私はダラマン、odal、ODAL、アモーダル、modalex、amodaleを取得したいです。

どうすれば正規表現でそれを行うことができますか?ところで、この質問には特定のプログラミング言語はありません。

+0

あなたは['\ b \ w *(?<!(?:mo))dal \ w * \ b'](https://regex101.com/r/rK3oP9/2)あなたのプログラミング言語をより正確に説明してください。 – Jan

+0

@Janこれは、基本的に私が既に提案したパターンです(いくつかの不要な追加がありますが、 '\ b'も必要でもなく、" mo "を非捕捉グループに入れる必要もありません)。 –

+0

@ByteCommander:そうです、答えを読んでいないし、私を削除しました。 – Jan

答えて

1

"bar"が含まれているが、 "modal"と同じでないすべての単語をフルワードとして一致させるには、このパターンを使用できます。

パターン:

\w*dal(?<!\bmodal\b)\w* 

説明:

  • \w*一致単語任意の数の文字(英数字および下線 "_")、ゼロ
  • dal含むこと文字通り配列 "DAL" と一致
  • (?<!\bmodal\b)は、「モーダル」シーケンスがこのトークンの左側ですぐに一致させる。
    \bはワード境界でのみ一致しますが、文字は消費しません。
  • \w*一致単語任意の数の文字(英数字と「_」アンダースコア)、ゼロ

Check this regex out on regex101.com


含めてこれは質問の前に有効であった私の答えの古いバージョンであります更新:

i(大文字小文字の区別なし)フラグとともに下記のパターンを使用できます。
正規表現を処理するために使用するプログラミング言語や環境に応じて、パターンの別々の出現と一致するようにg(グローバル)フラグを設定するか、すべての一致を検索する環境のメソッドを使用するか、のようなPythonでre.findall()

パターン:

\S*(?<!mo)dal\S* 

説明:

  • \S*がゼロ
  • (?<!mo)保証否定後読みがあるなど、空白文字以外の任意の数を、一致するシーケンス "MO" でしこのトークンのすぐ左に一致しないでください
  • dalは、

    \S*(?<!%%FORBIDDEN_LEFT%%)%%REQUIRED%%(?!%%FORBIDDEN_RIGHT%%)\S* 
    

    :CEゼロ

Check this regex out on regex101.com


より一般的に含む文字通り

  • \S*マッチ "DAL" 非空白文字の任意の数の、あなたはこのパターンを使用することができますプレースホルダを置き換えた後%%REQUIRED%%%%FORBIDDEN_LEFT%%および%%FORBIDDEN_RIGHT%%あなたが必要とするどんな弦でも。

    たとえば、 "cd"は一致させたいが、 "abcdef"は一致させたくない場合は、パターン\S*(?<!ab)cd(?!ef)\S*を使用する必要があります。

  • +0

    これは最初の有効な単語にのみ一致します。残りはどう? – CinCout

    +0

    @CinCout OPが正規表現を使用する言語によって異なります。たとえばPythonでは、すべての出現を返す 're.findall()'メソッドがあります。言語がそれを提供しない場合、正規表現のグローバルフラグ 'g'に依存する必要があります。私はこれを私の答えに加えて説明を加えました。あなたからのdownvoteはbtwでしたか? –

    +0

    これで答えは完了です。私はdownvoterではありません、あなたを失望させて申し訳ありません。 – CinCout

    関連する問題