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

Ani*_*oel 2 c# regex csv

重复

用于c#中的变量声明和初始化的正则表达式

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

[^,]+
Run Code Online (Sandbox Code Playgroud)

我的工作是通过在","的每一次出现时分割出来的.我想知道的是说我有字符串

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

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

我试过 - >

^value_name\s+([^,]+)*
Run Code Online (Sandbox Code Playgroud)

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

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

我理解错了吗?

Ren*_*uis 6

你可以使用类似于那些建议的正则表达式:

(?:^value_name\s+)?([^,]+)(?:\s*,\s*)?
Run Code Online (Sandbox Code Playgroud)
  • 第一组是非捕获的,并且匹配线的起点和value_name.
    为了确保正则表达式对所有匹配仍然有效,我们通过使用'?'修改后的意思使该组可选(意味着最多匹配一次).

  • 第二组是捕获并匹配您的vXX数据.

  • 第三组是非捕获的,并且会匹配,它之前和之后的任何空格.
    同样,我们通过使用'?'修饰符使其成为可选项,否则最后一'vXX'组将不匹配,除非我们以final结束字符串','.

在你的试验中,正则表达式不会多次匹配:你必须记住,如果你想要一个正则表达式匹配字符串中的多个匹配项,整个正则表达式需要匹配字符串中的每一个匹配项,所以你必须建立你的正则表达式不仅要匹配字符串的开头'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();
} 
Run Code Online (Sandbox Code Playgroud)