2012-07-20 50 views
0

如何在C#中使用正則表達式匹配多個字符串?
例如,在下面的句子中,我想檢查字符串L - VDom是否存在。如何使用AND運算符?

L - V 8:30 a 22:00 hrs。聖多美和晚上11點到22點。

我在使用正則表達式的AND運算符問題。

Regex.IsMatch(hours, @"\bL - V\b.*?\Dom\b") 

任何想法?

感謝

+0

告訴我們你正在使用的代碼 – 2012-07-20 15:01:15

+0

你的代碼返回true。有什麼問題? – aquinas 2012-07-20 15:11:38

回答

2

這可能是更清楚地使用兩個單獨的正則表達式(或只是the String.indexOf(String) method)和C#的普通&&操作;但如果你想要把它變成一個單一的正則表達式,那麼你就可以一次將這些:

L - V.*Dom    <-- if `L - V` will always come before `Dom` 
(L - V.*Dom|Dom.*L - V) <-- if you don't know which will come first 

.手段「比換行以外的任何字符」,所以.*意味着「零個或多個非換行符」 ,即「不包含換行符的任何子字符串」)。

2

可以做簡單的

using System; 
using System.Text.RegularExpressions; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     string txt="L - V 8:30 a 22:00 hrs. Sab y Dom..11:00 a 22:00 hrs."; 

     string re1="(L)"; // Any Single Character 1 
     string re2=".*?"; // Non-greedy match on filler 
     string re3="(-)"; // Any Single Character 2 
     string re4=".*?"; // Non-greedy match on filler 
     string re5="(V)"; // Any Single Character 3 
     string re6=".*?"; // Non-greedy match on filler 
     string re7="(Dom)"; // Word 1 

     Regex r = new Regex(re1+re2+re3+re4+re5+re6+re7,RegexOptions.IgnoreCase|RegexOptions.Singleline); 
     Match m = r.Match(txt); 
     if (m.Success) 
     { 
      String c1=m.Groups[1].ToString(); 
      String c2=m.Groups[2].ToString(); 
      String c3=m.Groups[3].ToString(); 
      String word1=m.Groups[4].ToString(); 
      Console.Write("("+c1.ToString()+")"+"("+c2.ToString()+")"+"("+c3.ToString()+")"+"("+word1.ToString()+")"+"\n"); 
     } 
     Console.ReadLine(); 
    } 
    } 
} 
+0

我喜歡使用正則表達式,因爲我有很多不同的條件。感謝您的答覆。 – Naveen 2012-07-20 19:08:54

3

您可以做得一樣爲/L - V.*Dom/一個正則表達式這樣或做兩場比賽和和。

2

如果你想使用正則表達式嘗試:

bool isMatch = Regex.IsMatch(hours, @"^\bL - V\b.*?\Dom.*$"); 

,但你也可以說

bool isMatch = hours.IndexOf("L - V") != -1 && hours.IndexOf("Dom") != -1 

也許沒有正則表達式就更簡單了,在我看來,如果事情可以在沒有正則表達式來完成,沒有正則表達式。也許在這種情況下,如果你想要更寬容一些,例如甚至可以匹配L-VL- V,那麼使用正則表達式是值得的(但我們需要修改表達式)。

1

那麼,你的正則表達式返回true,所以我不知道你爲什麼有問題。話雖如此,一個正則表達式在這裏看起來可能有點矯枉過正,特別是如果你不知道哪個字符串是第一個。我可能會這樣做:

var haystack = "L - V 8:30 a 22:00 hrs. Sab y Dom..11:00 a 22:00 hrs."; 
if (new List<string> { "L - V", "Dom" }.TrueForAll(needle => haystack.Contains(needle))) 
{ 
    ///stuff 
} 
2

這是RegEx的默認行爲與AND結合使用的術語。你的表達幾乎是正確的,除了「Dom」的「D」之前的反斜線。你也可以在「Dom」之前附加一個「\ b」以便找到整個單詞。另外「?」如果您只想檢查模式的存在,則沒有區別。

\bL - V\b.*\bDom\b 

如果字符串中應包含「L - V」或「奪目」,表達的是

\b(L - V|Dom)\b 

如果發現整個單詞並不重要,你可以將全部的「\ b在這兩個表達式中都是 ("L - V.*Dom" resp。"L - V|Dom")或者只是用

hours.Contains("L - V") && hours.Contains("Dom")