我正在寻找一个正则表达式来解析CSV值,我遇到了这个正则表达式
[^,]+
我的工作是通过在“,”的每一次出现时分割单词。我想知道的是说我有字符串
value_name v1,v2,v3,v4,...
现在我想要一个正则表达式来找到单词v1,v2,v3,v4 ..
我试过了 - >
^value_name\s+([^,]+)*
但它对我不起作用。你能告诉我我做错了什么吗?我记得正在处理正则表达式及其状态机实现。它不是以同样的方式工作。
如果字符串以Value_name开头,后跟一个或多个空格。转到下一个州。在那个状态下读一个单词,直到“,”来。然后再做一次!每个单词都会被分组!
我理解错了吗?
答案 0 :(得分:6)
您可以使用类似于建议的正则表达式:
(?:^value_name\s+)?([^,]+)(?:\s*,\s*)?
第一组是非捕获的,并且会匹配行的开头和value_name
。
为了确保正则表达式对所有匹配仍然有效,我们通过使用'?'
修改(意味着匹配最多一次)使该组可选。
第二组正在捕获并匹配您的vXX
数据。
第三组是非捕获的,并且会匹配,
以及它之前和之后的任何空格。
我们再次使用'?'
修饰符将其设为可选项,否则最后'vXX'
组不会匹配,除非我们使用最终','
结束字符串。
在您的试验中,正则表达式不会多次匹配:您必须记住,如果您希望正则表达式匹配字符串中的多个匹配项,则整个正则表达式需要匹配每次出现在字符串中,因此您必须构建正则表达式,不仅要匹配字符串'value_name'
的开头,还要匹配其中'vXX'
的每一个匹配项。
在C#中,您可以使用以下代码列出所有匹配和组:
Regex r = new Regex(@"(?:^value_name\s+)?([^,]+)(?:\s*,\s*)?");
Match m = r.Match(subjectString);
while (m.Success) {
for (int i = 1; i < m.Groups.Count; i++) {
Group g = m.Groups[i];
if (g.Success) {
// matched text: g.Value
// match start: g.Index
// match length: g.Length
}
}
m = m.NextMatch();
}
答案 1 :(得分:3)
我希望它只能在组中获得v1,因为第一个逗号“阻止”它抓住其余的字段。你如何处理它取决于你在正则表达式上使用的方法,但是进行两次传递可能是有意义的,首先抓住所有用逗号分隔的字段,然后在空格上分解。也许^value_name\s+(?:([^,]+),?)*
代替。
答案 2 :(得分:2)
哦,是的,列表......
/(?:^value_name\s+|,\s*)([^,]+)/g
理论上会抓住它们,但你必须在循环中使用RegExp.exec()
来获取捕获,而不是整个匹配。
我希望在JS中进行预匹配:(。
否则,请按照Logan的想法:/^value_name\s+([^,]+(?:,\s*[^,]+)*)$/
后跟.split(/,\ s * /);