用于捕获字符串剩余部分的正则表达式

时间:2018-04-09 06:28:49

标签: c# regex

我有以下正则表达式:

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"];
}

}

2 个答案:

答案 0 :(得分:2)

这可能有点花哨,但我认为使用.NET Balancing GroupsMSDN)可以创建一个易于扩展的干净解决方案:

(?<statement>(?<word>\w+)+\s+(With|Without)\s+(?<-word>\w+)+(?(word)(?!)))|(?<statement>\sAND\s)|(?<remainder>\sAND$)

Demo

您可以在regexstorm.net/tester

在线测试模式

enter image description here

答案 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*