2016-05-23 4 views
-2

に一致せず:正規表現次のサンプルの入力テキストが与えられると第二ケース

{{A1 | DEF | GHI | JKL}}のHello World(*)。 {{A2 | mno}}バイバイの世界。

どのようにしてのみ{{ ... }}(即ちのみ{{A1|def|ghi|jkl}})の最初のインスタンスに一致する正規表現パターンを作成することができます。 A1A2は固定入力であり、def,ghi,jklおよびmnoは何でもかまいません。

\{\{A1\|(.*)\|(.*)\|(.*)\}\} 

をしかし、それはすべてのもの({{A1|def|ghi|jkl}}hello world. {{A2|mno}})を返します:

私はこれを試してみました。

defまたはghiまたはjklまたはmnoは数字、英字または他の言語(たとえば中国語/日本語/韓国語)です。

+1

正規表現のどの味(すなわち、言語やツール)を指定してください。時には大したことではない場合がありますが、この場合、ルックアラウンドが最良の解決策である場合、正規表現のフレーバの違いは大変重要です。 –

+0

@StevenDoggart:* "この場合、見た目が最善の解決策である" *:本当ですか? –

+1

@CasimiretHippolyte Ha!私は実際には* best *という言葉を使用することをためらった。なぜなら、詳細とロードされた言葉がなくても過度に強調されていたことを知っていたからだ。私はSOの正規表現コミュニティーがpedantryに好意的だが、English.SEサイトほど悪くはないことを知っているので、私はそれを取り除くと思った。 –

答えて

3

あなたが達成しようとしていることは少し不明です。最初は、あなたの問題は、あなたが本当に望んでいたときにあなたが全部を手に入れていたということだったと思ったのは、A1またはA2部分でした。もしそうなら、ここに答えはある:あなたが使用している正規表現の風味指定されていませんでしたので


、それは確かに言うのは難しいです。

(?<={{)\w+(?=(\|[^|}]*)+}}) 

ここでは、パターンの意味があります: - これは、正ルックの背後に表現されている

  • (?<={{)あなたはルックアラウンドをサポートするバージョンを使用している場合、あなたはこのような何かを行うことができます一致するものの前に特定の文字を付ける必要があると主張することを意味します。この場合、文字は{{です。
  • \w+ - これは実際に一致している部分です。この場合、それは1つ以上の単語文字です。 \wは特殊文字クラスです。ただし、使用する正規表現エンジンによってこの値は異なります。あなたのニーズに応じて、[A-Z][0-9]のようなものが適切かもしれません。
  • (?=(\|[^|}]*)+}}) - これは肯定的な先読み式です。それは、どんな一致にもいくつかの特定のパターンの文字が続く必要があることを主張することを意味します。この場合、一致するものは(\|[^|}]*)+}}となります。ルックアラウンドが不可能な場合

しかし、その後、あなたはこのように、キャプチャグループでそれを一致させることができます。

{{(\w+)(\|[^|}]*)+}} 

を、あなたがそのように行うならば、あなたは読む必要があります各マッチの最初のグループの値。

最初の試合が見つかるまでは、実際に使用しているツールや言語によって異なります。ほとんどの正規表現エンジンは、デフォルトで最初の一致のみを検索し、グローバル修飾子が指定されている場合は末尾に/gと表示されます。


はしかし、今、あなたの質問を編集して、あなたが何を意味するのか理解するために、より良いしようとした後、私はあなたの本当の問題は貪欲だと思います。正規表現では、*のような繰り返しは、デフォルトでは欲張りです。つまり、できるだけ多くのテキストをキャプチャし、それでも一致させることができます。この場合、可能な限り長い一致を見つけることは望ましくありません。この場合、可能な限り最短の一致を見つけることが必要です。繰り返しを怠惰にするだけで簡単に行うことができます(つまり貪欲でない)。これを行うには、*の後に?を追加するだけです。たとえば、

\{\{A1\|(.*?)\|(.*?)\|(.*?)\}\} 

しかし、それほど効率的ではありません。このパターンを頻繁に使用する場合や大きな入力に使用する場合は、.の代わりに[^}|]のようなより限定的な文字クラスを使用することをお勧めします。これにより、レイジー修飾子は不要です。より簡単に

\{\{A1\|([^}|]*)\|([^}|]*)\|([^}|]*)\}\} 

または、:たとえば

{{A1(\|([^}|]*)){3}}} 
0

あなたのパターンの問題点は、貪欲*数量のすべてを作ったということだけです。彼らは可能な限り多くの文字列を一致させています(パターン全体が一致するようにしています)。ちょうどそれら非貪欲*?ます

\{\{A1\|(.*?)\|(.*?)\|(.*?)\}\} 

https://regex101.com/r/pK4gE7/1

関連する問題