或正则表达式

时间:2012-05-02 19:47:45

标签: .net regex

我正在使用此(?<=^.*?;).*表达式逐个解析用户ID。它工作得很好,因为它们被;分隔,但是当它到达最后一个在他/她的id结尾没有;的人时就失败了。为了获得下一个ID,我使用^.*?;

一切都很好但是它走了aharris它失败并继续给我aharris。由于^.*?;已经给了我aharris,因此(?<=^.*?;).*不应该向我aharris

示例字符串:

jsmith; bbrown; kosborne; aharris

现在,有没有办法添加或切换^.*?;,如果最后一个人没有;

,它会给我空字符串

我希望我有意义。

2 个答案:

答案 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()