【问题标题】:How to find the strings between $ and /$ using Regex [closed]如何使用正则表达式查找 $ 和 /$ 之间的字符串 [关闭]
【发布时间】:2013-09-24 06:36:31
【问题描述】:

我有一个这样的字符串

ABCD$-$ToBeFetched1/$-$ToBeFetched2/$-EF$GH

如何检索$ 和/$ 之间的字符串?

预期的字符串应该是

  1. ToBeFetched1

  2. ToBeFetched2

【问题讨论】:

  • 欢迎来到 SO。 whathaveyoutried.com?请向我们展示您到目前为止所拥有的。 SO 不是代码编写服务,如果您提供自己工作的证据,您将获得更好的响应。请参阅the Help pages。
  • 试过这个 \$([^$]*)\ /$
  • 用您尝试过的内容更新您的问题。你快到了。也许你可以试试:\$([^$]*)\/\$
  • 请澄清:您是否特别想要基于正则表达式的解决方案?或者您对某些特定的编程语言或处理工具感兴趣?
  • @LuisFilipe:我刚刚回滚了它。 .Net 上下文是相关的,因为平台之间的正则表达式引擎/方言不同。

标签: c# .net text-parsing


【解决方案1】:

由于您有“打开”和“关闭”标记,正则表达式显然是围绕这种形式构建的:

[head-marker: $] [the content you are interested in: anything] [tail-marker: /$]

所以,加上一个括号来形成一个捕获组:

$(.*)$

但是,这里有两个问题:* 表达式是贪婪的(你不希望它是贪婪的,因为你想要所有最小的匹配) - 所以它必须被削弱,而且 $ 是一个特殊字符在正则表达式中,所以它必须被转义:

\$(.*?)/\$

这形成了几乎很好的表达方式。然而,它会错误地匹配此类输入:

aaaaa/$bbbbb/$ccccc    ->    bbbbb

因为“head-marker”可以跳过斜线并点击第一个美元符号,这很可能是您不想要的。因此,在这里也可以进行一些回顾:

(?!</)\$(.*?)/\$

?!&lt;XXXX 指示仅在 XXXX 不在潜在匹配之前进行匹配。

另见MSDN: Regex syntax and operators

edit:实际上 Arie 的建议要简单得多,因为它不使用捕获组。但请注意细微差别:Arie 的示例明确禁止数据包含美元符号,因此ABCD$-$ToBeFe$tched1/$- 将导致tched1 而不是ToBeFe$tched1。如果您需要后者,只需更改内部 [^$] 部分。思考并选择您真正需要的东西!

【讨论】:

    【解决方案2】:

    (?

    (? - 积极的向后看:它确保您的比赛在 $ 之后立即开始($ 不包括在比赛中)

    [^$]{1,} - 匹配 $ 以外的字符; {1,} 而不是 * 以确保没有空匹配项(对于类似 "$/$" 的字符串)

    (?=/\$) - 积极的前瞻:它确保您的比赛在 /$ 之前结束(/$ 不包括在比赛)

    【讨论】:

      【解决方案3】:

      使用字符串方法:

      string s ="ABCD$-$ToBeFetched1/$-$ToBeFetched2/$-EF$GH";
      
      var results = s.Split('-')
                     .Where(x=> x.StartsWith("$") && x.EndsWith("/$"))
                     .Select(y=> y.Substring(1,y.Length - 3));
      
      //Console.WriteLine("string1: {0}, string2:{1}",results.ToArray());
      

      【讨论】:

      • 确实!我刚刚把它回滚了。 .Net 上下文是相关的,因为平台之间的正则表达式引擎/方言不同。
      【解决方案4】:
      Regex r = new Regex(Regex.Escape("-$") + "(.*?)"  + Regex.Escape(@"/$"));
                      MatchCollection matches = r.Matches("ABCD$-$ToBeFetched1/$-$ToBeFetched2/$-EF$GH");
                  foreach (Match match in matches)
                  {
                      Console.WriteLine(match.Groups[1].Value);
                  }
      

      这里肯定会起作用。

      【讨论】:

      • 假设输入不是以没有- 符号的$data/$ 组开始
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      • 1970-01-01
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      相关资源
      最近更新 更多