你將正則表達式的整個字符串(即驗證或過濾) ?如果是這樣,蒂姆的答案應該把你的權利。但是如果你從一個更大的字符串中抽取比賽,它會變得更加複雜。下面是我會怎麼做:
string input = @"Pattern could be 011Q-0SH3-936729 or 011Q-0SH3-936729-SDF3 or 000-222-AAAA or 011Q-0SH3-936729-011Q-0SH3-936729-011Q-0SH3-936729-011Q-0SH3-936729 but not 345-3763-46 or ASFS-DFGS-FSDF or ASD123FGH987.";
Regex pluckingRegex = new Regex(
@"(?<!\S) # start of 'word'
(?=\S*\p{L}) # contains a letter
(?=\S*\p{N}) # contains a digit
(?=\S*-) # contains a hyphen
[\p{L}\p{N}-]+ # gobble up letters, digits and hyphens only
(?!\S) # end of 'word'
", RegexOptions.IgnorePatternWhitespace);
foreach (Match m in pluckingRegex.Matches(input))
{
Console.WriteLine(m.Value);
}
輸出:
011Q-0SH3-936729
011Q-0SH3-936729-SDF3
000-222-AAAA
011Q-0SH3-936729-011Q-0SH3-936729-011Q-0SH3-936729-011Q-0SH3-936729
負lookarounds作爲「字」的界限:他們確保匹配的子開始無論是在字符串的開頭或空格後字符((?<!\S)
)和結束或者在字符串的末尾或空白字符((?!\S)
)之前。
三個積極向前看符號的工作就像添的,除了他們使用\S*
跳過任何的第一個字母/數字/連字符之前。在這種情況下,我們不能使用.*
,因爲這可以讓它跳到下一個單詞或下一個單詞等等,從而擊敗了lookahead的目的。
請問模式總是在字符串中的第五和第十指數幾許? – Oded 2011-03-04 09:18:13
我們知道有多少破折號?破折號之間是否總有規則大小的字母/數字組?字母在A-Z中? ...還是字符集的更大部分? – spender 2011-03-04 09:18:37
是在一個固定的位置破折號,或者他們可以在任何地方? (ROFL ...我太慢了:) – 2011-03-04 09:18:53