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

时间:2010-06-22 17:23:06

标签: c# vb.net regex

我想要听取以下内容:

Guiness Harp "Holy Moses"

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

Guiness
Harp
Holy Moses

除非空格周围有引号,否则基本上它会拆分空格,然后引号之间的单词被视为单个短语。

谢谢, 凯文

4 个答案:

答案 0 :(得分:5)

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

 "[^"]*"|\S+

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

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

例如(Python):

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

答案 1 :(得分:3)

这是另一种方法:

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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 );
}

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