如何在C#中使用正则表达式匹配多个字符串?
例如,在下面的句子中,我想检查字符串L - V
和Dom
是否存在。如何使用AND运算符?
L - V 8:30 a 22:00 hrs。圣多美和晚上11点到22点。
我在使用正则表达式的AND运算符问题。
Regex.IsMatch(hours, @"\bL - V\b.*?\Dom\b")
任何想法?
感谢
如何在C#中使用正则表达式匹配多个字符串?
例如,在下面的句子中,我想检查字符串L - V
和Dom
是否存在。如何使用AND运算符?
L - V 8:30 a 22:00 hrs。圣多美和晚上11点到22点。
我在使用正则表达式的AND运算符问题。
Regex.IsMatch(hours, @"\bL - V\b.*?\Dom\b")
任何想法?
感谢
这可能是更清楚地使用两个单独的正则表达式(或只是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
(.
手段“比换行以外的任何字符”,所以.*
意味着“零个或多个非换行符” ,即“不包含换行符的任何子字符串”)。
可以做简单的
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();
}
}
}
我喜欢使用正则表达式,因为我有很多不同的条件。感谢您的答复。 – Naveen 2012-07-20 19:08:54
您可以做得一样为/L - V.*Dom/
一个正则表达式这样或做两场比赛和和。
如果你想使用正则表达式尝试:
bool isMatch = Regex.IsMatch(hours, @"^\bL - V\b.*?\Dom.*$");
,但你也可以说
bool isMatch = hours.IndexOf("L - V") != -1 && hours.IndexOf("Dom") != -1
也许没有正则表达式就更简单了,在我看来,如果事情可以在没有正则表达式来完成,没有正则表达式。也许在这种情况下,如果你想要更宽容一些,例如甚至可以匹配L-V
或L- V
,那么使用正则表达式是值得的(但我们需要修改表达式)。
那么,你的正则表达式返回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
}
这是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")
告诉我们你正在使用的代码 – 2012-07-20 15:01:15
你的代码返回true。有什么问题? – aquinas 2012-07-20 15:11:38