基于关键字进行过滤的正则表达式

时间:2018-05-19 07:49:08

标签: c# regex regex-group

我想过滤字符串并根据关键字('OR','AND','NOT')等制作组,但在括号内排除关键字“OR”,“NOT”,“AND”等。 / p>

Email=sample@sample.com OR Something ='(101010101010 OR 0101010123)'和Id = \“02341-21236-43497-123234 \”AND CreatedDate:[2017-06-20T06:14:11Z至2017- 07-20T06:14:11Z]

输出组应如下所示:

  1. Email=sample@sample.com
  2. Something =(101010101010 OR 0101010123)
  3. Id =“02341-21236-43497-123234”
  4. CreatedDate:[2017-06-20T06:14:11Z至2017-07-20T06:14:11Z]

1 个答案:

答案 0 :(得分:1)

这样的事情怎么样:

(?<=^|AND|OR)(?:[^()]+?|.+?\(.+?\).+?)(?=\s*AND|OR|$)

Try it online

<强>故障:

  • (?<=^|AND|OR)断言前面的字符为ANDOR或字符串的开头。
  • (?:非捕获组的开始。
    • [^()]匹配除()以外的任何字符。
    • +?匹配前一个字符的一次或多次(延迟匹配)。
    • |或。
    • .+?匹配任何字符的一次或多次(懒惰匹配)。
    • \(字面匹配字符(
    • .+?匹配任何字符的一次或多次(懒惰匹配)。
    • \)字面匹配字符)
    • .+?匹配任何字符的一次或多次(懒惰匹配)。
  • )非捕获组结束。
  • (?=\s*AND|OR|$)断言以下字符为ANDOR或字符串的结尾。

C#中的使用示例:

static List<string> ExtractParts(string input)
{
    string pattern = @"(?<=^|AND|OR)(?:[^()]+?|.+?\(.+?\).+?)(?=\s*AND|OR|$)";
    var matches = Regex.Matches(input, pattern);

    List<string> list = new List<string>();
    foreach (Match m in matches)
    {
        list.Add(m.Value.Trim());
    }

    return list;
}

static void Main(string[] args)
{
    string input = @"Email=sample@sample.com OR " +
                   @"Something = '(101010101010 OR 0101010123 )'" +
                   @" AND Id = \""02341 - 21236 - 43497 - 123234\""";
    List<string> parts = ExtractParts(input);
    foreach (string part in parts)
    {
        Console.WriteLine(part);
    }
    Console.ReadLine();
}

Live example

希望有所帮助。