2015-12-25 49 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; 
} 
相关问题