0

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

一切都很好,但是当aharris它失败并不断给我aharris。这^.*?;不应该给我aharris,因为(?<=^.*?;).*已经给了我aharris

示例字符串:

jsmith; bbrown; kosborne; aharris

现在,如果最后一个人没有,有没有办法添加或切换^.*?;它会给我空字符串的位置;

我希望我说得通。

4

2 回答 2

1

示例字符串的结构方式,您可以使用以下模式将其分解:

"((?:^|; )(?<userId>.*?))+"

括号的第一个子集是一个“非捕获”组,它匹配一行的开头(对于第一项),或者一个分号后跟一个空格(对于所有其他项)。括号的第二个子集将非贪婪地匹配任何字符集(意味着将使用导致匹配整个模式的最小字符集),并将它们“捕获”在可以通过其名称引用的集合中,“用户身份”。

按以下方式使用此模式(需要引用/使用 System.Text.RegularExpressions 和 System.Linq):

var match = Regex.Match(input, pattern);
var userIds = match.Groups["userId"].Captures.OfType<string>().ToList();

完成后,userIds 将被实例化,List<string>填充此字符串中的所有四个 userIds。

于 2012-05-02T20:06:56.310 回答
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()
于 2012-05-02T19:56:09.190 回答