我有以下正则表达式:
public static Regex regex = new Regex( @"(?:\s+(?<statement>(?:[\w./]+)?\s*(?:(?:With|Without)\s*(?:[\w./]+))?)\s*(?:$|\s+AND))+(?<remainder>.*)");
对于字符串&#34; 汤姆与简和迈克没有安妮和&#34;我可以捕捉到&#34; Tom With Jane &#34;和#34; 迈克没有安妮&#34;作为陈述。现在我想抓住最后一个&#34; AND&#34;在&#34;余下&#34;因为没有其他声明。我怎样才能做到这一点?这是我使用的代码:
class Program {
public static Regex regex = new Regex( @"(?:\s+(?<statement>(?:[\w./]+)?\s*(?:(?:With|Without)\s*(?:[\w./]+))?)\s*(?:$|\s+AND))+(?<remainder>.*)" );
static void Main( string[] args ) {
var s = " Tom With Jane AND Mike Without Anne AND";
var match = regex.Match( s );
var statements = match.Groups["statement"];
var remainder = match.Groups["remainder"];
}
}
答案 0 :(得分:2)
这可能有点花哨,但我认为使用.NET Balancing Groups(MSDN)可以创建一个易于扩展的干净解决方案:
(?<statement>(?<word>\w+)+\s+(With|Without)\s+(?<-word>\w+)+(?(word)(?!)))|(?<statement>\sAND\s)|(?<remainder>\sAND$)
在线测试模式
答案 1 :(得分:0)
为什么不使用\s*AND\s*
分割字符串?
string s = " Tom With Jane AND Mike Without Anne AND";
string[] ss = Regex.Split(s.Trim(), @"\s*AND\s*");
会给你
new string[] { "Tom With Jane", "Mike Without Anne", "" }
如果您想避免匹配包含&#34; AND&#34;的名称并且仍然匹配&#34; AND&#34;在字符串的末尾,您可以添加一个字边界约束:\s*\bAND\b\s*
。