在C#中扩展[^,] +,正则表达式

时间:2009-02-26 06:12:01

标签: c# regex csv

复制

  

Regex for variable declaration and initialization in c#

我正在寻找一个正则表达式来解析CSV值,我遇到了这个正则表达式

[^,]+

我的工作是通过在“,”的每一次出现时分割单词。我想知道的是说我有字符串

  

value_name v1,v2,v3,v4,...

现在我想要一个正则表达式来找到单词v1,v2,v3,v4 ..

我试过了 - >

^value_name\s+([^,]+)*

但它对我不起作用。你能告诉我我做错了什么吗?我记得正在处理正则表达式及其状态机实现。它不是以同样的方式工作。

如果字符串以Value_name开头,后跟一个或多个空格。转到下一个州。在那个状态下读一个单词,直到“,”来。然后再做一次!每个单词都会被分组!

我理解错了吗?

3 个答案:

答案 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 * /);