私は現在、ファイルから16桁の数字を引き出す正規表現を持っています。
正規表現:
Regex.Match(l, @"\d{16}")
これは、次のような数に対してうまく機能します。
1234567891234567
次のような正規表現に数値を含めるにはどうすればよいですか。
1234 5678 9123 4567
と
1234-5678-9123-4567
すべてのグループが常に 4 桁の場合:
\b\d{4}[ -]?\d{4}[ -]?\d{4}[ -]?\d{4}\b
区切り文字がグループ間で同じであることを確認します。
\b\d{4}(| |-)\d{4}\1\d{4}\1\d{4}\b
常にすべて一緒または 4 のグループである場合、単一の正規表現でこれを行う 1 つの方法は次のようなものです。
Regex.Match(l, @"\d{16}|\d{4}[- ]\d{4}[- ]\d{4}[- ]\d{4}")
次のようなものを試すことができます:
^([0-9]{4}[\s-]?){3}([0-9]{4})$
これでうまくいくはずです。
注意: これにより、
1234-5678 9123 4567
ダッシュだけ、またはスペースだけでは厳密ではありません。
これは、すべての数字を取得し、ダッシュまたはスペースを取り除くパターンです。また、数字が 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));
別のオプションは、現在持っている正規表現を使用し、正規表現を実行する前に問題のある文字をすべて文字列から取り除くことです。
var input = fileValue.Replace("-",string.Empty).Replace(" ",string.Empty);
Regex.Match(input, @"\d{16}");