【问题标题】:Regular expression to retrieve text from a string从字符串中检索文本的正则表达式
【发布时间】:2012-07-07 21:55:53
【问题描述】:

我有一个字符串,它的值类似于

{ctrl1} + {ctrl2}
({ctrl1} / {ctrl2}) * {ctrl3}
if ({ctrl1} > {ctrl2}) then {ctrl1} * 10 else {ctrl} + {ctrl2} endif

可能有几个这样的公式。这将在字符串变量中可用。我需要提取所有 {..} 值。

因此,在示例 1 中,我应该提取 {ctrl1}{ctrl2}。在示例 2 中,我应该提取 {ctrl1}{ctrl2}{ctrl3}。在example3中,我应该提取{ctrl1}{ctrl2}

有人可以帮我用正则表达式吗?

【问题讨论】:

  • 最后一个例子中的{ctrl}呢?

标签: c# regex


【解决方案1】:

你可能想要{[^}]+}之类的东西。

但是请注意,这不会处理像{hello{2}} 这样的递归内容。你可能需要一个真正的解析器来处理这样的事情。

【讨论】:

    【解决方案2】:

    {\S+?} 之类的东西应该可以解决问题。

    【讨论】:

    • 不确定 C# 的正则表达式实现,但可能会捕获 {ctrl1}+{ctrl2}。可能应该使用非贪婪匹配或使用{[^}]+}
    • @cha0site 你是对的,它会匹配{ctrl1}+{ctrl2}。尽管 在给出示例数据的情况下,它仍然为提议的问题提供了解决方案,但我看不出投票失败的原因。
    • 对不起,我不是反对者。你真的应该为非贪婪匹配添加?,它会让你的答案更好。
    • @cha0site 并没有针对您,只是笼统地说给投反对票的人。我已经更新了非贪婪匹配的答案。
    【解决方案3】:

    您可以结合正则表达式和 LINQ 并执行以下操作:

    Regex.Matches(input, "{.*?}").Cast<Match>().Select(m => m.Value).Distinct();
    

    假设 {ctrl} 是上一个示例中的拼写错误。

    【讨论】:

      【解决方案4】:
      private void TrimControlNames()
          {
              if (txtFormula.Text.Trim().Length > 0)
              {
                  string formula = txtFormula.Text.Trim();
      
                  string pattern1 = "{[a-zA-Z0-9$_ ]+}"; //to identify control placeholders
                  StringBuilder names = new StringBuilder();
                  foreach (Match m in Regex.Matches(formula, pattern1))
                  {
                      if (m.Value.Contains(" "))
                      {
                          string str = m.Value.Replace(" ", string.Empty); //It is ok to remove like this since control names are not allowed to have spaces.
                          formula = formula.Replace(m.Value, str);
                      }
      
                  }
      
                  txtFormula.Text = formula;
              }
      
          }
      

      这个方法符合我的预期。

      【讨论】:

      • 你的方法不起作用。你为什么不使用你得到的答案之一?
      猜你喜欢
      • 2020-06-03
      • 1970-01-01
      • 2023-01-13
      • 2016-03-05
      • 1970-01-01
      • 2018-08-20
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      相关资源
      最近更新 更多