我正在尝试从字符串中提取值<<和>>。但它们可能会发生多次。
任何人都可以帮助使用正则表达式来匹配这些;
this is a test for <<bob>> who like <<books>>
test 2 <<frank>> likes nothing
test 3 <<what>> <<on>> <<earth>> <<this>> <<is>> <<too>> <<much>>.
然后我想要预先通过GroupCollection获取所有值。
任何帮助都很受欢迎。 感谢。
答案 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);
}
答案 1 :(得分:2)
您可以尝试以下方法之一:
(?<=<<)[^>]+(?=>>)
(?<=<<)\w+(?=>>)
但是你必须迭代返回的MatchCollection。
答案 2 :(得分:0)
答案 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