在没有多个模式的情况下提取多个可变长度文本的次数

时间:2015-09-30 01:17:41

标签: c# .net regex

从以下数据.xxx[val1, val2, val3]中,需要提取val1val2val3的值。

如果使用此模式@"\[(.*?), (.*?), (.*?)\]",则可以提取数据,但是当数据字符串变化时,无法获取所有数据。

采取这些变量示例

.xxx[val1].xxx[val1, val2, val3, val4, val5] 或者最后.xxx[{1-N},]

单个正则表达式模式可以在作为示例提供的所有数据集上获得结果吗?

4 个答案:

答案 0 :(得分:3)

  

这是什么样的正确模式?

最佳做法不是与未知事物相匹配,而是在知识之后设计你的模式。在类似的实践中,使用.*(零或更多的任何东西)进行回溯的盲目匹配可能会非常缓慢;为什么在不需要时会增加复杂性。

坦率地说,人们应该支持+一个或多个使用超过*零或更多的用法,这些用法在特定项目可能不会出现时应该真正使用。

  

字符串可以变化。

通过您的示例看来,如果我们像编译器一样思考,则令牌由,或结尾]分隔。因此,让我们用这些知识(知识)开发一种模式。

捕获的最佳方法是消耗直到找到已知的。使用 not [^ ]模式集是最好的;表示匹配此集合中的字符。然后添加我们的总量词{{​​1}},其中包含一个或多个。有效地替换旧模式中的+,但反向

.*

<强>结果

enter image description here

答案 1 :(得分:2)

您可以在第一步中捕获@"\[(.*?)\]",然后在,上拆分,这肯定比使用正则表达式执行相同操作要快得多。

答案 2 :(得分:1)

更简单的方法是匹配tell application "Terminal" to do script "cd '/a/path with spaces'" 内的所有内容,然后拆分匹配。

[]

这是一个javascript示例,我不做c#,所以不要搞砸了它。)

答案 3 :(得分:1)

尽管如果一个组重复它会覆盖它的值,它会将整个捕获堆栈存储为Capture Collection,由Group.Captures Property中的每个组返回。

  

<强> Group.Captures Property

     

当量化器应用于捕获组时,会发生Captures属性的实用性,以便该组在单个正则表达式中捕获多个子字符串。在这种情况下,Group对象包含有关最后捕获的子字符串的信息,而Captures属性包含有关该组捕获的所有子字符串的信息。

然后,您可以简单地使用此模式:

\[(?:([^,\]]+),?\s*)+\]

<强>代码:

string pattern = @"\[(?:([^,\]]+),?\s*)+\]";
var re = new Regex( pattern);
var text = @".xxx[val1, val2, val3]";


MatchCollection matches = re.Matches(text);
for (int mnum = 0; mnum < matches.Count; mnum++)
{   //loop matches
    Match match = matches[mnum];
    Console.WriteLine("Match #{0} - Value: {1}", mnum + 1, match.Value);
    int captureCtr = 0;
    foreach (Capture capture in match.Groups[1].Captures)
    {  //loop captures for the 1st Group
       Console.WriteLine("      Capture {0}: {1}", 
                         captureCtr, capture.Value);
       captureCtr += 1;                  
    }
}

<强>输出:

Match #1 - Value: [val1, val2, val3]
      Capture 0: val1
      Capture 1: val2
      Capture 2: val3