我通常从一个巨大的列表中提取戴尔服务标签,我有一些应该提取7个字母数字标签的代码,但如果文档中有额外的文本,它有时会提取额外的文本。
我的模式:
Regex rServTag_Pattern = new Regex(@".*(?=.{7})(?=.*\d)(?=.*[a-zA-Z]).*");
var mTag = rServTag_Pattern.Match(Clipboard.GetText());
在大多数情况下,它确实有效,但经过一段时间后,它会变得烦人并提取超过需要的东西。我怎样才能确保它只提取7Alpha-Numeric字符串?
示例服务标签:7DJHT90,LK2JHN4等(这些不是实际的服务标签。
答案 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。