我正在使用此(?<=^.*?;).*
表达式逐个解析用户ID。它工作得很好,因为它们被;
分隔,但是当它到达最后一个在他/她的id结尾没有;
的人时就失败了。为了获得下一个ID,我使用^.*?;
一切都很好但是它走了aharris
它失败并继续给我aharris
。由于^.*?;
已经给了我aharris
,因此(?<=^.*?;).*
不应该向我aharris
。
示例字符串:
jsmith; bbrown; kosborne; aharris
现在,有没有办法添加或切换^.*?;
,如果最后一个人没有;
我希望我有意义。
答案 0 :(得分:1)
构造示例字符串的方式,您可以使用以下模式将其分解:
"((?:^|; )(?<userId>.*?))+"
括号的第一个子集是“非捕获”组,它匹配行的开头(对于第一个项),或者分号后跟空格(对于所有其他)。括号的第二个子集将非常匹配任何字符集(意味着将使用最小的字符集导致整个模式匹配),并在可以通过其名称引用的集合中“捕获”它们,“用户id”。
以下列方式使用此模式(需要引用/使用System.Text.RegularExpressions和System.Linq):
var match = Regex.Match(input, pattern);
var userIds = match.Groups["userId"].Captures.OfType<string>().ToList();
完成后,userIds将是一个实例化的List<string>
,其中填充了此字符串中的所有四个userIds。
答案 1 :(得分:0)
使用
"jsmith; bbrown; kosborne; aharris".Split(';').Select(x => x.Trim()).ToList()
代替。
评论中的讨论产生了以下提议:
Regex.Matches("\w+(?=\s*;)", "jsmith; bbrown; kosborne; aharris").Cast<Match>().Select(m => m.Value).ToList()