正则表达式替换除特定模式之外的所有内容

时间:2015-01-15 16:02:15

标签: c# regex replace

我想提取:

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]+\%")

我们可以形成一个正则表达式并反转结果,就好像它是一个选择?这将允许使用正则表达式替换。但是,我找不到一种方法来轻松反转正则表达式。

我们如何使用非常简短的语法实现所需的结果(或类似的;连接或似乎可以接受),类似于正则表达式替换?

3 个答案:

答案 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);
    }
}