2012-05-02 99 views
0

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

一切都很好,但它的时间去aharris它失败并一直给我aharris。这^.*?;不应该给我aharris因为(?<=^.*?;).*已经给我aharris

样品字符串:

jsmith; bbrown; kosborne; aharris 

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

我希望我做的意义。

回答

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() 
+0

我想知道tolist是否会在我的sharepoint工作流程中工作。 –

+0

我试过这个但不工作。如果(^。* ?;)then(^。* ?;)(?: else(null))?endif –

+0

usr:我试过你的方法,但是如果我输入mwatkin,它会返回mwaktin。它不应该返回。然而,如果我有mwakin;那么我希望mwatkin –

1

的方式,例如串的结构,你可以用以下方式进行分解:

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

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

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

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

完成后,用户id将是一个实例List<string>填入用户id的所有四个从这个字符串。

+0

Keith:感谢发布,但我使用Nintex Workflow,它位于SharePoint工作流引擎并采用.net正则表达式。我无法在nintex中实例化var。 –

+0

这是一个.NET正则表达式,所以只要您使用的任何实际机制完全支持.NET正则表达式并允许检索捕获的组,该模式仍然有效。 – KeithS

+0

它可以是如果然后其他?例如,如果否;发现在提供字符串然后给我什么。如果找到则使用^。* ?; –

相关问题