2015-12-25 48 views
-1

嘗試在鍵(值)模式中將字符串與多個括號進行匹配。具有多個括號的子字符串的正則表達式

字符串1:

hostportservice(192.168.1.241(10001), service(master)) hostportservice(192.168.1.200(10001), service(slave)) 

字符串1個相配

hostportservice(192.168.1.241(10001), service(master)) 
hostportservice(192.168.1.200(10001), service(slave)) 

字符串2:

hostportservice(192.168.1.241(10001), service(master)) updatedate(24-DEC-2015) updatetime(11:32:57 PM) 

字符串2個匹配

hostportservice(192.168.1.241(10001), service(master)) 
updatedate(24-DEC-2015) 
updatetime(11:32:57 PM) 
+0

我正在準備一個解決方案,但您能清楚地定義,什麼是輸入和什麼是所需的輸出?例如問題陳述,請檢查以下問題:http://stackoverflow.com/questions/33181434/regex-matching-any-character-which-repeats-n-times – ferit

+0

輸入字符串可能是多行字符串,每個字符串在一行可能包含多個由空格分隔的字符串。匹配將在此模式鍵(值)中。但是價值可能會有更多的父對象或空間。我發現這部分非常具有挑戰性。感謝至少以積極的方式迴應。 –

+0

不,不是正確的方法,只是給我輸入文本,並輸出文本。給我一些我可以測試我的試驗。用英文解釋它並不清楚。 – ferit

回答

1

我不認爲RegEx是這個問題的正確方法,這將更容易解決programmaticaly。在C#中,這意味着迭代整個字符串,每次計算paranthesis計數爲0並計算空間並分割空間。

+0

我會走這條路。謝謝。 –

1

有點複雜:

([^\s]+\s[^\s]+)\s+([^\s]+)\s+([^\s]+\s[^\s]+)|([^\s]+\s[^\s]+)\s+([^\s]+\s[^\s]+) 

演示在這裏:https://regex101.com/r/jP9uO0/1

+0

我真誠地感謝您的寶貴時間。然而,我嘗試了一個不同的字符串,但只匹配了幾個完整的字符串。鏈接這裏 https://regex101.com/r/yT5lI9/1 –

+0

對不起,問題不是我的解決方案。問題是你的問題。你在這個鏈接中的測試用例與你給我的集合完全不同。首先,您必須正確地確定問題所在,然後才能解決問題。但實際發生在這裏的是我們正在追逐我們的尾巴... 請檢查這個問題,以瞭解如何清楚地聲明正則表達式問題:http://stackoverflow.com/questions/33181434/regex-matching-any-character -which-repeats-n-times?lq = 1 – ferit

+0

謝謝。我同意你的解決方案沒有問題。我給了一個示例模式/字符串。無論弦的長度如何,在我給出的例子中,要提取的模式都保持不變。非常感謝你。 –

0

你正在嘗試實現.NET正則表達式使用平衡組完成。你應該讀上來就下面的鏈接

下面是爲您的工程案例的代碼。您可能需要使用它才能使其適用於您的所有情況。

var pattern = new Regex(
        @"\s*(?'TXT'(?:" +    /* Let's capture this expression */ 
         @"[^()]*" +     /* Part before parens start */ 
         @"(?:(?'OPEN'\()[^()]*)+" + /* Capture open paren followed by any text */ 
         @"(?'-OPEN'\))+" +   /* Now remove the captured open paren group for every closed paren */ 
        @")+?)" +      /* Finished capture group */ 
        @"(?(OPEN)(?!))"     /* Confirm that no extra open parens are left on the stack */ 
        ); 
var inputString = 
     @"hostportservice(192.168.1.241(10001), service(master)) hostportservice(192.168.1.200(10001), service(slave))" + Environment.NewLine + 
     @"hostportservice(192.168.1.241(10001), service(master)) updatedate(24-DEC-2015) updatetime(11:32:57 PM)"; 

Match match; 
int startAt = 0; 
while ((match = pattern.Match(inputString, startAt)).Success) { 
    Debug.WriteLine("Pattern Matched: " + match.Groups["TXT"].Value); 
    startAt = match.Index + match.Length; 
} 
相關問題