正则表达 – 如何查找单词和引用的短语

我想要一串说下面的话:

Guiness Harp "Holy Moses" 

这样在C#或VB中得到一个匹配集:

 Guiness Harp Holy Moses 

基本上它除了在空格周围有引号之外在空格上分裂,然后引号之间的那些单词被认为是单个短语。

谢谢,凯文

如果您在引用的字符串中没有任何(转义或加倍)引号,则可以搜索

  "[^"]*"|\S+ 

但是,报价将成为比赛的一部分。 如果需要,可以扩展正则表达式以处理引用字符串中的引号。

另一种(在这种情况下是优选的)可能性是使用csv解析器。

例如(Python):

 import csv reader = csv.reader(open('test.txt'), delimiter=' ', quotechar='"') for row in reader: print(row) 

这是另一种方法:

 string s0 = @"Guiness Harp ""Holy Moses"""; Regex r = new Regex(@"""(?[^""]*)""|(?\S+)"); foreach (Match m in r.Matches(s0)) { Console.WriteLine(m.Groups["FIELD"].Value); } 

这利用了.NET正则表达式允许您在同一个正则表达式中重用组名的事实。 很少有正则表达式的口味允许这样,而只有Perl 6的那些就像.NET一样灵活。

正则表达式无法计数,这使分隔符解析变得困难。

我会使用解析器而不是正则表达式。

如果这是一个简单的解析,您可以修剪起始和结束引号。

 string text = "Guiness Harp \"Holy Moses\""; string pattern = @"""[^""]*""|\S+"; MatchCollection matches = Regex.Matches( text, pattern ); foreach( Match match in matches ) { string value = match.Value.Trim( '"' ); Console.Out.WriteLine( value ); } 

但是,这种实现不是很灵活。 我只在内部工具中使用这样的东西。 或者你不介意扔掉你的代码。