3

文字列の特定の場所で正規表現が一致するかどうかを調べたい。

例:

Regex r = new Regex("d");
string s = "abcdefg";

上記の例を使用して、位置、、およびでのマッチングが、、およびをそれぞれ与えるように、一致関数が正確に指定された場所にある場合にのみ一致を見つけるようにします。残念ながら、C# の方法では次のようになります。135no matchmatchno matchRegex.Match

r.Match(s, 1); // => match ("d")
r.Match(s, 3); // => match ("d")
r.Match(s, 5); // => no match

これは、Regex.Matchメソッドが最初の一致を前方検索するためだと理解していますが、部分文字列を作成せずにこの動作を防ぐにはどうすればよいですか?

4

3 に答える 3

5

正規表現の先頭に追加\Gします。

Regex r = new Regex(@"\Gd");
string s = "abcdefg";
Console.WriteLine(r.Match(s, 1).Success); // False
Console.WriteLine(r.Match(s, 3).Success); // True
Console.WriteLine(r.Match(s, 5).Success); // False

\G前の一致が終了した位置、または前の一致がなかった場合は文字列の先頭に一致を固定します。の 2 番目の引数を使用すると、その場所で終了した以前の一致があっMatchたことを事実上伝えています。

于 2012-11-29T14:01:04.627 に答える
2

substring文字列開始アンカーを使用し^ます。

Regex r = new Regex("^d"); // Use the start of string anchor
string s = "abcdefg";
r.IsMatch(s.Substring(3)); // Match at exactly fourth character (0-based index 3)

または、文字列をメモリにコピーしないようにするには、quantified を使用します.

Regex r = new Regex("^.{3}d");
r.IsMatch("abcdefg");

パターン^.{3}dは言う

  • 文字列の先頭から開始
  • 任意の文字の正確に 3 文字に一致
  • 次に、文字「d」に一致します
于 2012-11-29T13:08:41.393 に答える
1

常に同じインデックスを探している場合は、先頭にワイルドカードを追加して結果を「パディング」することで、正規表現をもう少し詰め込むことができます。つまり、次のようになります。

Regex r = new Regex("^.{3}d");
r.isMatch("abcdefg"); // true
r.isMatch("adcffed"); // false
r.isMatch("abcddef"); // true

一方、異なるインデックスで同じ正規表現を使用したい場合は^、文字列の先頭のみを一致させるために文字を使用できます。

Regex r = new Regex("^d");
r.isMatch("abcdefg".substring(3)); // true
r.isMatch("adcffed".substring(3)); // false
r.isMatch("abcddef".substring(1)); // false

NB : パターンではなく単純な文字列を探しているだけの場合は、単に使用する必要がありますstring.IndexOf

于 2012-11-29T13:13:47.830 に答える