5

単一の正規表現が文字列全体、文字列の先頭、または C# の一部に一致するかどうかを判断する方法を探しています。

MatcherJava では、オブジェクトを構築し、メソッドmatches()を使用して、入力全体lookingAt()に一致するかどうか、入力の開始に一致するかどうか、文字find()列内からの一致があるかどうかを確認できます。 .

.NET では、Match.Success一致するものがあるかどうかを確認Match.IndexMatch.Length、上記の条件を確認するために使用できます。

問題は、より小さな一致が見つかった場合、入力全体を一致させようとしないことです。たとえば、入力「1234」が Regex@"\d{2}|\d{4}"に提示された場合、最初の 2 桁と一致します。

そのような場合、入力全体をテストするパターンを使用して別Regexのパターンを作成し、次に別のパターン@"^(\d{2}|\d{4})$"をテストして最初と一致するかどうかを確認する必要があります。

Regexこの理由で別の正規表現を作成 (およびコンパイル) する必要がないように、同じクラスに入力全体の一致を優先するように指示する方法はありませんか?


編集:質問はパターンに関するものではなく、私が何を意味するかを示すための単なる例です。

4

2 に答える 2

3

いいえ、.NET には「先頭のみ一致」または「文字列全体のみ一致」の正規表現メソッドはありません。アンカーを使用してこの動作を構築する必要があります。

ある意味では、Java が行うことよりもこれを好む理由が 2 つあります。

  • .matches()文字列全体に一致する必要があることを知らないため、多くの人が混乱しています。この正確な問題について、SOで少なくとも1ダースの質問を見てきました。
  • 同じ機能を 2 つの異なる場所で重複して保持するのはなぜですか? 正規表現の文法にはすでにアンカーがあるのに、なぜ一部の (時には誤解を招くような名前の) メソッドでそれらを暗黙的にするのでしょうか? (私はあなた、Python、およびあなたのre.search()vs. re.match()*と話している)。

とはいえ、それも非常に簡単です。

  • @"\A(?:"+ 元の正規表現 + ")"--> lookingAt()(その名前を考えたのは誰ですか)?
  • @"\A(?:"+ 元の正規表現 + @")\z"-->matches()

* ご参考までに、 は ではなくre.match()Java の のように動作します。lookingAt()matches()

于 2012-09-22T20:38:54.943 に答える
0

Regex.Match / Regex.IsMatch ?
サブコレクションを持つ Match オブジェクトを返します。

http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.match.aspxを参照してください。

于 2012-09-22T20:17:58.263 に答える