我想提取:
50%
来自具有或多或少此格式的字符串:
The 50% is in here somewhere.
我还想提取:
50%50%25%
来自这样的字符串:
50% of 50% is 25%
Regex.Match()
似乎是明显的竞争者。但是,这涉及检查是否找到任何匹配(例如match.Success
),从数组中的特定索引中提取结果,和/或解决越界索引的风险。
正则表达式替换通常更容易应用。单行完成工作,包括返回结果字符串。对于这么多语言来说都是如此。
result = Regex.Replace(input, stuffWeDontLike, "")
基本上,我正在寻找正则表达式过滤器 - 而不是输入替换的模式,我想输入模式 retrieve
percentages = Regex.Filter("50% of 50% is 25%", "[0-9]+\%")
我们可以形成一个正则表达式并反转结果,就好像它是一个选择?这将允许使用正则表达式替换。但是,我找不到一种方法来轻松反转正则表达式。
我们如何使用非常简短的语法实现所需的结果(或类似的;连接或似乎可以接受),类似于正则表达式替换?
答案 0 :(得分:2)
我不明白你为什么要使用替换的原因。为什么一开始就这样走? Regex
类中有一些方法可以让您精确地获得所有想要的匹配。你找到解决方案的迂回方式是没有意义的。
只需使用Matches()
来收集匹配项。然后,您可以将它们加入到您想要的字符串中。
var str = "50% of 50% is 25%";
var re = new Regex(@"\d+%");
var ms = re.Matches(str);
var values = ms.Cast<Match>().Select(m => m.Value);
var joined = String.Join("", values); // "50%50%25%"
答案 1 :(得分:1)
一种解决方案是使用正则表达式替换如下:
Regex.Replace("50% of 50% is 25%", "(\d+\%)|(?:.+?)", "$1");
输出:
50%50%25%
作为一般方法:
Regex.Replace(input, (pattern)|(?:.+?), "$1");
找到符合以下任何一项的任何内容:
$1
。这就是我们想要保留的内容。?:
因为我们不需要捕获此群组。正如MSDN所述:“$1
用第一个捕获的子表达式替换整个匹配。” (即,该子串的所有匹配,连接。)
实际上,这是描述的正则表达式过滤器。
答案 2 :(得分:1)
您可以使用Regex.Matches
并连接每个匹配结果。只需选择一个你最喜欢的。
//Sadly, we can't extend the Regex class
public class RegExp
{
//usage : RegExp.Filter("50% of 50% is 25%", @"[0-9]+\%")
public static string Filter(string input, string pattern)
{
return Regex.Matches(input, pattern).Cast<Match>()
.Aggregate(string.Empty, (a,m) => a += m.Value);
}
}
public static class StringExtension
{
//usage : "50% of 50% is 25%".Filter(@"[0-9]+\%")
public static string Filter(this string input, string pattern)
{
return Regex.Matches(input, pattern).Cast<Match>()
.Aggregate(string.Empty, (a,m) => a += m.Value);
}
}