1

次のような構造を評価したいと思います。

家は緑ですが、私の好きな色は青赤と黄色です

私はこのような正規表現で家の色を決定します:

家\s+(\ w \ s *)+(?=(シアン|緑|赤|青))

それは何をするためのものか?この式は次の一致を返します。

家は緑ですが、私の好きな色は青です

つまり、指定されたCharacterClassの色のリスト内の文字列の最後の一致を返します。つまり、REDが表示されるまでかかりますが、最初に表示される色はGREENです。

私は何をすべきか?私が探しているのは、リストに記載されている最初の色を取り、見るのをやめることです。つまり、家の色は緑であり、他には何もありません。

Q1:指定した式が1つだけ表示されるまで文字列をループする方法、つまり、式(シアン、緑、青、赤)をXORのように動作するリストに変換する方法。重要:正規表現のみを使用してください。つまり、como.NETの背景言語、Java、PERLなどは使用しないでください...

Q2:私が見逃した正規表現を使用する代わりの方法はありますか?つまり、私がたどった道は正しい道ですか?

よろしくお願いします

4

2 に答える 2

1

あなた(\w\s*)+貪欲なので、最新の試合を返します; 可能な限り一致します(つまり、「赤」の直前まで)。

+?代わりにを使用して、貪欲でないものに変更できます+

the house\s+(\w\s*)+?(?=(cyan|green|red|blue))

しかし、私はあなたがそれよりもうまくやれると思います。

(\w\s*)+一度に1文字だけ一致する可能性があるのはなぜですか。代わりに単語全体を。と一致させてみませんか(\w+\s+)+

また、最初の色に合わせてみませんか?

the\s+house\s+(\w+\s+)+?(cyan|green|red|blue)

次に、キャプチャグループ2(括弧の2番目のセット)には、シアン、緑、赤、または青(つまり、カラーリスト)の最初の出現が含まれます。正規表現という単語が貪欲でないことを確認することに注意してください+?。つまり、「シアン」、「緑」、「赤」、「青」のインスタンスを飲み込まないことを意味します。

あなたもすることができます

house.*?\b(cyan|green|red|blue)

.*?貪欲ではなく、最初の色まですべてをむさぼり食うところ。これは「単語の境界」であり、たとえば、正規表現が「desired」の「 red\b」と一致しないことを確認します。

于 2012-04-03T23:38:28.727 に答える
0

これは私がPythonでそれを行う方法ですが、他の言語に.seach機能があるかどうかはわかりません。

「私が探しているのは、リストに記載されている最初の色を取り、見るのをやめることです。」

s='The house is green but my favorite colors are blue red and yellow'
import re
print re.search('(cyan|green|red|blue)',s,).group(1)
print re.match('The house is (cyan|green|red|blue)',s,).group(1)#or if u had to use the .match

(シアン|緑|赤|青)にスペースがないことに注意してください。

これを印刷します:

green
green
于 2012-04-03T23:37:13.720 に答える