【问题标题】:How do I find a variable length string between two marker characters in C#?如何在 C# 中的两个标记字符之间找到可变长度字符串?
【发布时间】:2012-01-26 21:42:37
【问题描述】:

这是一个非常基本的正则表达式问题,但我不太确定我哪里出错了。

我正在尝试获取这样的输入字符串:

string exp = @"$a$ + $ab$";

匹配模式$....$ 并替换原始字符串中的值。例如,我想用数字 1 替换 $a$,用数字 2 替换 $ab$,所以我的最终字符串看起来像 "1 + 2"

我设置的是以下功能:

private string SubstituteStandardValues(string exp)
{
    //Find Std values w/Regex
    Match match = Regex.Match(exp, @"/\($.*$\)/s", RegexOptions.IgnoreCase);

    if (match.Success)
    {
        foreach (var m in match.Groups)
        {
            //Do string replace logic here!
        }
    }
    return exp;
}

我的问题是match 总是false,这让我相信我的正则表达式不正确。

我误入歧途了?感谢您的帮助!

【问题讨论】:

  • /\ 是什么意思?另外,可能想使用惰性匹配,而不是贪婪
  • 除了正则表达式,一个简单的exp.Replace("$a$","1").Replace("$b$","2") 也可以工作。

标签: c# asp.net .net regex


【解决方案1】:

您的正则表达式模式字符串是这样的:

@"\$[^$]+\$"

.NET 正则表达式中没有正则表达式分隔符(“/”),也没有修饰符(“/s”)。为此使用RegexOptions

$ 表示“字符串结尾”,除非您对其进行转义或在字符类中。

您需要一个字符类来匹配“除 $ 之外的任何内容”([^$])。

如果整场比赛是您感兴趣的,则不需要组。

【讨论】:

    【解决方案2】:

    尝试使用此代码:

    public string SubstituteStandardValues(string exp)
    {
        var matches = Regex.Matches(exp, @"\$[a-z]+\$", RegexOptions.IgnoreCase);
    
        foreach (Match match in matches)
        {
            // replace logic here...
        }
    
        return exp;
    }
    

    【讨论】:

      【解决方案3】:

      你在括号前面放了一个反斜杠,这意味着它正在寻找文字“(”和“)”。但是,您必须避开美元符号。您也没有使用惰性量词。

      @"/(\$.*?\$)/"
      

      【讨论】:

      • 正斜杠有什么用?
      猜你喜欢
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-03
      • 2022-12-28
      相关资源
      最近更新 更多