【问题标题】:Regex: find whole pattern, replace partially正则表达式:查找整个模式,部分替换
【发布时间】:2013-06-07 06:54:40
【问题描述】:

我必须找到如下字符串:

"^some_text/some_number$"

例如:

"thetext/34526435"

如果some_text 是“通用”,则取斜杠后面的数字,将“通用”替换为空字符串,否则将some_text 替换为空字符串。

用一个正则表达式可以吗?

我正在使用来自 Microsoft.NET 的 Regex.Replace

【问题讨论】:

    标签: .net regex replace substring


    【解决方案1】:

    在 C# 中,是的。

    C# 正则表达式有一个叫做 MatchEvaluator 的东西。见这里:

    http://msdn.microsoft.com/en-us/library/cft8645c.aspx

    每次匹配都会调用 MatchEvaluator,询问它应该如何处理找到的值。无论它决定什么都将被替换到字符串中,因此您可以根据值有不同的替换逻辑。

    【讨论】:

      【解决方案2】:

      在 python 中,是的。

      re 模块有一个名为sub 的函数,它用repl 替换string 中所有出现的正则表达式pattern,例如

      sub(pattern,repl, string)
      

      看看here

      【讨论】:

        【解决方案3】:

        您没有说明输入的内容,因此您可能需要修改以下代码。您也没有说明文本部分的情况,所以我只是使用[a-zA-Z] 作为指导。随意更改您用来检查它是否是有效文本部分的方法(如\w 或其他内容)。

        委托的返回值可能看起来很简洁,但从问题的措辞来看,感觉不应该有太多的代码行之类的。随意扩展 if 语句和诸如此类的东西。

        string sInput = "generic/1234";
        string sOutput = Regex.Replace(sInput, "^(?<mytext>[a-zA-Z]+)/(?<mynum>\\d+)$", delegate(Match m)
        {
            return m.Groups["mytext"].Value.Equals("generic", StringComparison.OrdinalIgnoreCase) ? m.Groups["mynum"].Value : m.Groups["mytext"].Value;
        });
        

        您提到如果文本部分是“通用的”,您将使用数字,但您没有说明是否仍应包含斜杠。

        此外,代码仅适用于特定的“文本/数字”模式。如果原始字符串与模式不匹配,它将返回原始字符串。

        【讨论】:

          【解决方案4】:

          尝试将^(generic/([0-9]+)|([a-z]+)/[0-9]+)$ 替换为$2$3 (demo)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-06-06
            • 2012-09-30
            • 1970-01-01
            • 1970-01-01
            • 2013-09-27
            • 2014-11-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多