2012-05-02 143 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

它可以是如果然後其他?例如,如果否;發現在提供字符串然後給我什麼。如果找到則使用^。* ?; –

相關問題