正则表达式匹配超过{7}

时间:2017-06-01 21:56:34

标签: c# regex

我通常从一个巨大的列表中提取戴尔服务标签,我有一些应该提取7个字母数字标签的代码,但如果文档中有额外的文本,它有时会提取额外的文本。

我的模式:

Regex rServTag_Pattern = new Regex(@".*(?=.{7})(?=.*\d)(?=.*[a-zA-Z]).*");
var mTag = rServTag_Pattern.Match(Clipboard.GetText());

在大多数情况下,它确实有效,但经过一段时间后,它会变得烦人并提取超过需要的东西。我怎样才能确保它只提取7Alpha-Numeric字符串?

示例服务标签:7DJHT90,LK2JHN4等(这些不是实际的服务标签。

3 个答案:

答案 0 :(得分:0)

只需使用

var rServTag = new Regex(@"(?=([a-zA-Z]+\d[a-zA-Z\d]+|\d+[a-zA-Z][a-zA-Z0-9]+))[a-zA-Z0-9]{7}");

如果您需要避免从文本内部提取7个字母+数字组合,您可以添加单词边界:

var rServTag = new Regex(@"\b(?=([a-zA-Z]+\d[a-zA-Z\d]+|\d+[a-zA-Z][a-zA-Z0-9]+))[a-zA-Z0-9]{7}\b");

答案 1 :(得分:0)

使用wordboundaries隔离7个字符。

Regex rServTag_Pattern = new Regex(@".*\b[A-Z\d]{7}\b.*");

这假定服务标签中只有大写和数字(基于OP的样本输入)

答案 2 :(得分:0)

我会将您的问题分成两个步骤:

  • 通过分隔符分割输入
  • 处理每个拆分字符串

在您的情况下,我会将Clipboard.GetText()分割为所有非字母数字字符:

string[] splitArray = Regex.Split(Clipboard.GetText(), @"[^a-zA-Z\d]+");
foreach (string s in splitArray)
{
    // process s
}

然后,对于每个拆分字符串s,应用仅匹配至少包含一个字母(?=.*[a-zA-Z]),至少一个数字(?=.*\d)的字符串的正则表达式,并且正好是7个字符长{ {1}}:

^[a-zA-Z\d]{7}$

示例:

new Regex(@"^(?=.*[a-zA-Z])(?=.*\d)[a-zA-Z\d]{7}$");

鉴于输入Regex regex = new Regex(@"^(?=.*[a-zA-Z])(?=.*\d)[a-zA-Z\d]{7}$"); string[] splitArray = Regex.Split(Clipboard.GetText(), @"[^a-zA-Z\d]+"); foreach (string s in splitArray) { if (regex.IsMatch(s)) { // s is a valid service tag } } "123ABCD, ABCDEFG... ABCD123, 123AAAAAAAA"将等于splitArray

对于["123ABCD", "ABCDEFG", "ABCD123", "123AAAAAAAA"] regex.IsMatch(s)s

"123ABCD"将返回true。