0

如何在 C# 中使用正则表达式匹配句子中的多个字符串?
例如,在下面的句子中,我想检查字符串是否L - V存在Dom

L - V 8:30 a 22:00 小时。Sab y Dom..11:00 a 22:00 hrs。

我在正则表达式中遇到 AND 运算符的问题。

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

有任何想法吗?

谢谢

4

6 回答 6

3

您可以将其作为单个正则表达式来执行,例如,/L - V.*Dom/也可以进行两个匹配和一个和。

于 2012-07-20T15:02:08.020 回答
2

将术语与 AND 组合是 RegEx 的默认行为。你的表达几乎是正确的,除了“Dom”的“D”之前的反斜杠。您还可以在“Dom”之前附加一个“\b”,以便仅查找整个单词。还有“?” 如果您只想检查模式是否存在,则没有区别。

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

如果字符串应包含“L - V”或“Dom”,则表达式为

\b(L - V|Dom)\b

如果找到整个单词并不重要,您可以在两个表达式("L - V.*Dom"resp. "L - V|Dom")中删除所有的“\b”,或者只是这样做

hours.Contains("L - V") && hours.Contains("Dom")
于 2012-07-20T15:14:30.913 回答
2

使用两个单独的正则表达式(或仅使用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

.表示“除换行符以外的任何字符”,因此.*表示“零个或多个非换行符”,即“任何不包含换行符的子字符串”)。

于 2012-07-20T15:01:58.467 回答
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();
    }
  }
}
于 2012-07-20T15:02:00.303 回答
2

如果您想使用正则表达式,请尝试:

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

但你也可以说

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

也许没有正则表达式更简单,在我看来,如果没有正则表达式可以做某事,那就不用正则表达式。也许在这种情况下,如果您想更加宽容,例如匹配偶数L-VL- V值得使用正则表达式(但我们需要修改表达式)。

于 2012-07-20T15:08:51.210 回答
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
}
于 2012-07-20T15:13:52.583 回答