27

たとえば、正しい形式を確認する必要がある文字列があるとします。例RR1234566-001(2 文字、7 桁、ダッシュ、1 桁以上)。私は次のようなものを使用します:

        Regex regex = new Regex(patternString);
        if (regex.IsMatch(stringToMatch))
        {
            return true;
        }
        else
        {
            return false;
        }

これはstringToMatch、 が で定義されたパターンに従っているかどうかを教えてくれpatternStringます。私が必要としているのは (そして後でこれらを抽出することになります) は、次の 123456とおり001ですstringToMatch

これは、正規表現の作成方法に関する質問ではないことに注意してください。私が求めているのは、「後で分割関数を使用せずに、値の照合と抽出を同時に行う方法はありますか?」ということです。

4

4 に答える 4

72

正規表現グループを使用してそれを実現できます。たとえば、この正規表現は次のとおりです。

(\d\d\d)-(\d\d\d\d\d\d\d)

電話番号をこの正規表現と一致させましょう:

var regex = new Regex(@"(\d\d\d)-(\d\d\d\d\d\d\d)");
var match = regex.Match("123-4567890");
if (match.Success)
    ....

一致する場合は、最初の 3 桁が次の場所に表示されます。

match.Groups[1].Value

次の 7 桁は次のとおりです。

match.Groups[2].Value

PS C# では、@"" スタイルの文字列を使用して、バックスラッシュのエスケープを回避できます。たとえば、@"\hi\" は "\\hi\\" と同じです。正規表現とパスに役立ちます。

PS2。最初のグループは、Group[0] ではなく、Group[1] に格納されます。これは、Group[0] に一致した文字列全体が含まれているためです。

于 2009-05-08T21:28:11.417 に答える
18

代わりにグループ化と一致を使用してください。

すなわち:

// NOTE: pseudocode.
Regex re = new Regex("(\\d+)-(\\d+)");
Match m = re.Match(stringToMatch))

if (m.Success) {
  String part1 = m.Groups[1].Value;
  String part2 = m.Groups[2].Value;
  return true;
} 
else {
  return false;
}

次のように、一致に名前を付けることもできます。

Regex re = new Regex("(?<Part1>\\d+)-(?<Part2>\\d+)");

そして、このようにアクセスします

  String part1 = m.Groups["Part1"].Value;
  String part2 = m.Groups["Part2"].Value;
于 2009-05-08T21:37:18.740 に答える
13

括弧を使用して、文字のグループをキャプチャできます。

string test = "RR1234566-001";

// capture 2 letters, then 7 digits, then a hyphen, then 1 or more digits
string rx = @"^([A-Za-z]{2})(\d{7})(\-)(\d+)$";

Match m = Regex.Match(test, rx, RegexOptions.IgnoreCase);

if (m.Success)
{
    Console.WriteLine(m.Groups[1].Value);    // RR
    Console.WriteLine(m.Groups[2].Value);    // 1234566
    Console.WriteLine(m.Groups[3].Value);    // -
    Console.WriteLine(m.Groups[4].Value);    // 001
    return true;
}
else
{
    return false;
}
于 2009-05-08T21:44:56.197 に答える