2014-09-30 52 views
0

我有一個正則表達式的列表,我遍歷它來找到匹配的字符串模式。如何獲得匹配整個字符串,而不是隻是部分?

我想獲得與「00000.00」完全匹配的正則表達式的索引,但是,0的正則表達式也返回true,但只應返回true,如果有一個數字或長度爲5的字符串或6.

含義,12345和123456應該是有效的,但12345.0或123456.0不應該。

List<Regex> regexPatterns = new List<Regex>{ 
    new Regex(@"\b\d{5,6}\b"),    // 0 
    new Regex(@"\b\d{5,6}[.](00)\b")  // 1 
} 

string text = "00000.00"; 

for(int i = 0; i < regexPatterns.Count; i++) { 
    if(regexPatterns.IsMatch(text)) return i; 
} 

這使對00000.00返回0時,我希望它返回1

**該指數具有意義,所以他們重新排序是沒有做不到的。

+0

我覺得這裏的問題是,在期間充當字boundry導致比賽對你的第一個表情發生。如果您可以反轉表達式並首先測試較長的表達式,那麼您應該在它上面找到匹配。 – StuffOfInterest 2014-09-30 20:57:55

回答

2

嘗試的開始和字符串的結尾^$

List<Regex> regexPatterns = new List<Regex>{ 
    new Regex(@"^\d{5,6}$"),    // 0 
    new Regex(@"^\d{5,6}[.](00)$"),  // 1 
} 

Regular Expression Language - Quick Reference

^比賽必須開始在字符串或行的開頭。

$匹配必須發生在字符串末尾或\n之前的行或字符串末尾。

+0

有些解釋會更好,我相信這是正確的答案。 – 2014-09-30 20:57:09

+0

我在http://www.regexr.com/上試過這個,但似乎沒有工作... – Vongdarakia 2014-09-30 20:58:25

+0

@ user3228667你可能做錯了什麼。我只是嘗試過,而且工作。 – 2014-09-30 21:01:17

0

由於這段時間將作爲一個字界限,你最好的選擇是從最複雜的模式掃描到最簡單。你可以做你的for循環遞減來完成這個,但另一種考慮的方法是使用你的模式的字典,其中值組件是返回值。

var patterns = new Dictionary<string, int> 
    { 
     { @"\b\d{5,6}\b", 0 }, 
     { @"\b\d{5,6}[.](00)\b", 1 }, 
    }; 

string text = "00000.00"; 

foreach (var pattern in patterns.Keys) 
{ 
    if (pattern.IsMatch(text)) 
     return patterns[pattern]; 
} 
0

檢查是否有在第一個無期:

List<Regex> regexPatterns = new List<Regex>{ 
    new Regex(@"\d{5,6}[^.]"),    // 0 
    new Regex(@"\d{5,6}[.](00)")  // 1 
} 

string text = "00000.00"; 

for(int i = 0; i < regexPatterns.Count; i++) { 
    if(regexPatterns.IsMatch(text)) return i; 
} 
相關問題