2017-07-24 61 views
0

之间,我有一个这样的字符串:正则表达式支架

if (Regex.IsMatch(arg, "^(<.+>){4}$")) 
       return true; 

但我怎样才能获得括号内的内容,方法是:

<random stuff between><random stuff between><random stuff between><random stuff between> 

我已经可以使用这个正则表达式匹配这个字符串也使用正则表达式?

+0

预期产量是多少? 4'子串之间的随机东西? –

回答

4

试试这个代码:

var source = "<abc><def><g><hij>"; 
var pattern = new Regex("<(?<content>[^>]+)>"); 

var content = pattern.Matches(source).Cast<Match>().Select(m => 
    m.Groups["content"].Value).ToArray(); 


编辑如果您需要的4组,您可以使用此代码(从@C帕金斯评论):

var pattern = new Regex("^(<(?<content>[^>]+)>){4}$"); 
var content2 = pattern.Match(source).Groups["content"].Captures 
         .Cast<Capture>().Select(c => c.Value) 
         .ToArray(); 
+1

这里应该注意一些重要的区别,这不是固定的,不限于像原始的4个重复。但是如果你使用限定符('{4}'),则唯一提取的组将是最后一个。另一种方法是明确重复该模式4次。 –

+0

是的,这正是我的意思! :) – Kyu96

+0

@MattBurland你是对的,谢谢。 Upvoted your answer –

0

使用下面的代码它会工作。

 Regex regex = new Regex(@"[\w\s]+"); 

     string example = "<random stuff between><random stuff between> 
          <random stuff between><random stuff between><a><a 
          a>"; 

     Match match = regex.Match(example); 

     while (match.Success) 
     { 
      Console.WriteLine(match); 
      match = match.NextMatch(); 
     } 
2

为了完整起见,如果它是很重要的比赛被锚定并具有完全相同4组,那么你就必须明确地重复组,你可以这样做:

^<(.+)><(.+)><(.+)><(.+)>$ 

虽然[^>]可能是一个比.

更安全的赌注然后括号内的每一段文本将在您的比赛中的一个单独的组。

显然,当您稍后决定需要5个匹配项或50个匹配项或可变数量的匹配项时,这并不是很灵活。在这种情况下,请使用Aleks的答案。

最后,如果您的数据实际上是XML或类似的情况,您最好不要使用正则表达式,而应使用适当的解析器。