我想要听取以下内容:
Guiness Harp "Holy Moses"
这样在C#或VB中得到一个匹配集:
Guiness
Harp
Holy Moses
除非空格周围有引号,否则基本上它会拆分空格,然后引号之间的单词被视为单个短语。
谢谢, 凯文
答案 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 );
}
但是,这种实现方式不够灵活。我只在内部工具中使用这样的东西。或者你不介意扔掉你的代码。