2017-06-01 113 views
0

我通常從一個巨大的列表中提取戴爾服務標籤,我有一段代碼應該提取7個Alpha-Numeric標籤,但如果文檔中有額外的文本,它會有時會提取額外的文本。正則表達式匹配超過{7}

我的模式:

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

對於它真正起作用的大部分,但一段時間後,這很令人討厭,提取比所需要的更多。我怎樣才能確保它只提取7Alpha-數字字符串?

示例服務標籤:7DJHT90,LK2JHN4,等等(這些都不是實際的服務標籤

+0

你可以發佈一些包含服務標籤的示例輸入嗎?給我們一些額外的文本可以幫助我們捕獲正確的子串並避免不需要的位。服務標籤是否始終只有CAPS和數字? – mickmackusa

回答

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"); 
+0

不幸的是,它不起作用,它也匹配單詞,而不僅僅是字母數字字符。 http://regexr.com/3g318 – herboren

+0

字母是字母數字字符。我想你的意思是它必須有字母和數字。 – NetMage

+0

@herboren好的,更新我的RE到一些複雜的東西。 – NetMage

0

使用wordboundaries隔離7個字符

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

這是假設只有在服務標籤首都和數字(基於OP的樣品輸入)

+0

多數民衆贊成在可怕的,我剛剛閱讀這杯濃咖啡 – herboren

+0

@herboren我不是一個C#編碼器。如果我的回答不起作用,我寧願將其從此頁面中刪除。你能告訴我它是否適合你的情況嗎? – mickmackusa

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個字符長的正則表達式^[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 
    } 
} 

鑑於INP ut "123ABCD, ABCDEFG... ABCD123, 123AAAAAAAA"splitArray將等於["123ABCD", "ABCDEFG", "ABCD123", "123AAAAAAAA"]

regex.IsMatch(s)對於s"123ABCD""ABCD123"將返回true。