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

如果总是在一起或四人一组,那么使用单个正则表达式执行此操作的一种方法是:

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 回答