2014-01-13 105 views
0

我需要由线被分开线执行以下操作:正则表达式分开单词

实施例:

word "multiple set" another word L&D "another set" 

输出:

word 
multiple set 
another 
word 
L&D 
another set 
我目前使用

(?<match>\w+)|\""(?<match>[\w\s]*) 

但它不适用于安培rsand(&)

谢谢!

+0

using C#a那么现在 –

+2

......那么你为什么不使用'\ S'而不是单词字符呢?我不知道为什么你会期望“字符”匹配&符号... – Doorknob

+0

你试过逃避&符号吗? –

回答

1

尝试:"(.*?)"|(\S+)

这将懒洋洋地在引号OR任何一套非whitepace字符之间的匹配任何字符。

示例here。根据不同的语言,您可能需要避开双引号(\"(.*?)\")。

像@abiessu提到的那样,您可以使用更具体的([^"]*)选择器替换懒惰选择器(.*?)。延迟选择器将选择所有内容,直到选择器之后的第一个字符(以下"),其中更具体的([^"]*)将选择除"之外的所有内容。不确定延迟选择器与字符类型之间是否存在性能差异,但是它取决于您。

+1

我更喜欢''[^”] *“'更好...... – abiessu

+0

增加了选项@ abiessu。 – Sam

+1

这工作!谢谢 –

0

如果您传递给Regex.Split的模式包含捕获组,则捕获的文本将包含在结果集中。例如:

var input = "word \"multiple set\" another word L&D \"another set\""; 
var output = Regex.Split(input, "\"([^\"]*)\"|\\s"); 

产生一个结果集是这样的:

"word" 
"" 
"multiple set" 
"" 
"another" 
"word" 
"L&D" 
"" 
"another set" 
"" 

现在,如果你只是删除空元素(一个小的LINQ可以在这里很有用):

var output = Regex.Split(input, "\"([^\"]*)\"|\\s").Where(x => x.Length > 0); 

产生如下结果集:

"word" 
"multiple set" 
"another" 
"word" 
"L&D" 
"another set"