6

私は現在、ファイルから16桁の数字を引き出す正規表現を持っています。

正規表現:

Regex.Match(l, @"\d{16}")

これは、次のような数に対してうまく機能します。

1234567891234567

次のような正規表現に数値を含めるにはどうすればよいですか。

1234 5678 9123 4567

1234-5678-9123-4567

4

5 に答える 5

3

すべてのグループが常に 4 桁の場合:

\b\d{4}[ -]?\d{4}[ -]?\d{4}[ -]?\d{4}\b

区切り文字がグループ間で同じであることを確認します。

\b\d{4}(| |-)\d{4}\1\d{4}\1\d{4}\b
于 2012-04-20T12:32:31.363 に答える
1

常にすべて一緒または 4 のグループである場合、単一の正規表現でこれを行う 1 つの方法は次のようなものです。

Regex.Match(l, @"\d{16}|\d{4}[- ]\d{4}[- ]\d{4}[- ]\d{4}")

于 2012-04-20T12:32:56.603 に答える
1

次のようなものを試すことができます:

^([0-9]{4}[\s-]?){3}([0-9]{4})$

これでうまくいくはずです。

注意: これにより、

1234-5678 9123 4567

ダッシュだけ、またはスペースだけでは厳密ではありません。

于 2012-04-20T12:33:08.727 に答える
0

これは、すべての数字を取得し、ダッシュまたはスペースを取り除くパターンです。また、数字が 16 個しかないことを検証するためにチェックすることに注意してください。無視オプションは、パターンがコメント化されるためのものであり、一致処理には影響しません。

string value = "1234-5678-9123-4567";
string pattern = @"
^                   # Beginning of line
(                   # Place into capture groups for 1 match
  (?<Number>\d{4})    # Place into named group capture
  (?:[\s-]?)          # Allow for a space or dash optional
){4}                  # Get 4 groups
(?!\d)                # 17th number, do not match! abort
$                   # End constraint to keep int in 16 digits
";

var result = Regex.Match(value, pattern, RegexOptions.IgnorePatternWhitespace)
                  .Groups["Number"].Captures
                  .OfType<Capture>()
                  .Aggregate (string.Empty, (seed, current) => seed + current);


Console.WriteLine ( result ); // 1234567891234567

// Shows False due to 17 numbers!
Console.WriteLine ( Regex.IsMatch("1234-5678-9123-45678", pattern, RegexOptions.IgnorePatternWhitespace));
于 2012-04-20T12:52:13.167 に答える
0

別のオプションは、現在持っている正規表現を使用し、正規表現を実行する前に問題のある文字をすべて文字列から取り除くことです。

var input = fileValue.Replace("-",string.Empty).Replace(" ",string.Empty);
Regex.Match(input, @"\d{16}");
于 2012-04-20T12:36:08.163 に答える