我想过滤字符串并根据关键字('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]
输出组应如下所示:
答案 0 :(得分:1)
这样的事情怎么样:
(?<=^|AND|OR)(?:[^()]+?|.+?\(.+?\).+?)(?=\s*AND|OR|$)
<强>故障:强>
(?<=^|AND|OR)
断言前面的字符为AND
,OR
或字符串的开头。(?:
非捕获组的开始。
[^()]
匹配除(
或)
以外的任何字符。+?
匹配前一个字符的一次或多次(延迟匹配)。|
或。.+?
匹配任何字符的一次或多次(懒惰匹配)。\(
字面匹配字符(
。.+?
匹配任何字符的一次或多次(懒惰匹配)。\)
字面匹配字符)
。.+?
匹配任何字符的一次或多次(懒惰匹配)。)
非捕获组结束。(?=\s*AND|OR|$)
断言以下字符为AND
,OR
或字符串的结尾。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();
}
希望有所帮助。