我正在寻找一个正则表达式来解析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开头,后跟一个或多个空格.转到下一个州.在那个状态下读一个单词,直到","来.然后再做一次!每个单词都会被分组!
我理解错了吗?
你可以使用类似于那些建议的正则表达式:
(?:^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)
| 归档时间: |
|
| 查看次数: |
1250 次 |
| 最近记录: |