RegEx在字符串中多次匹配

时间:2011-02-03 22:24:51

标签: c# regex

我正在尝试从字符串中提取值<<和>>。但它们可能会发生多次。

任何人都可以帮助使用正则表达式来匹配这些;

this is a test for <<bob>> who like <<books>>
test 2 <<frank>> likes nothing
test 3 <<what>> <<on>> <<earth>> <<this>> <<is>> <<too>> <<much>>.

然后我想要预先通过GroupCollection获取所有值。

任何帮助都很受欢迎。 感谢。

4 个答案:

答案 0 :(得分:39)

使用正向前看并查看断言以匹配尖括号,使用.*?匹配这些括号之间可能的最短字符序列。通过迭代MatchCollection方法返回的Matches()来查找所有值。

Regex regex = new Regex("(?<=<<).*?(?=>>)");

foreach (Match match in regex.Matches(
    "this is a test for <<bob>> who like <<books>>"))
{
    Console.WriteLine(match.Value);
}

LiveDemo in DotNetFiddle

答案 1 :(得分:2)

您可以尝试以下方法之一:

(?<=<<)[^>]+(?=>>)
(?<=<<)\w+(?=>>)

但是你必须迭代返回的MatchCollection。

答案 2 :(得分:0)

这样的事情:

(<<(?<element>[^>]*)>>)*

这个程序可能很有用:

http://sourceforge.net/projects/regulator/

答案 3 :(得分:0)

虽然Peter's answer是使用环视法进行左右上下文检查的一个很好的示例,但我也想添加一种LINQ(lambda)方法来访问匹配项/组并显示简单数字{ {3}}在您只希望提取部分模式时会很方便:

using System.Linq;
using System.Collections.Generic;
using System.Text.RegularExpressions;

// ...

var results = Regex.Matches(s, @"<<(.*?)>>", RegexOptions.Singleline)
            .Cast<Match>()
            .Select(x => x.Groups[1].Value);

与Peter编译的regex相同的方法,其中整个匹配值可通过Match.Value访问:

var results = regex.Matches(s).Cast<Match>().Select(x => x.Value);

注意

  • <<(.*?)>>是匹配<<的正则表达式,然后捕获任何0个或多个字符尽可能少(由于非贪心*?量词)分为第1组,然后匹配>>
  • RegexOptions.Singleline也使.匹配换行符(LF)字符(默认情况下不匹配)
  • Cast<Match>()将匹配集合转换为IEnumerable<Match>,您可以使用lambda进一步访问
  • Select(x => x.Groups[1].Value)仅返回当前x匹配对象的第1组值
  • 请注意,您可以通过在.ToList()之后添加.ToArray()Select来进一步创建获取值数组的列表。

capturing groups中,string.Join(", ", results)生成一个用逗号分隔的组1值的字符串:

var strs = new List<string> { "this is a test for <<bob>> who like <<books>>",
                              "test 2 <<frank>> likes nothing",
                              "test 3 <<what>> <<on>> <<earth>> <<this>> <<is>> <<too>> <<much>>." };
foreach (var s in strs) 
{
    var results = Regex.Matches(s, @"<<(.*?)>>", RegexOptions.Singleline)
            .Cast<Match>()
            .Select(x => x.Groups[1].Value);
    Console.WriteLine(string.Join(", ", results));
}

输出:

bob, books
frank
what, on, earth, this, is, too, much