【问题标题】:Parse a string, keeping all of the matches in between given strings (multi-character delimiters)解析字符串,将所有匹配项保留在给定字符串之间(多字符分隔符)
【发布时间】:2016-01-22 22:57:12
【问题描述】:

这与这里的问题非常相似:How do I extract text that lies between parentheses (round brackets)? 我看到了这个正则表达式代码:

var matches = Regex.Matches("User name [[sales]] and [[anotherthing]]", @"\[\[([^)]*)\]\]");

但这似乎不适用于多字符分隔符?这甚至可能不是正确的方法,但我确信我不是第一个尝试这个的人,我在这里画一个空白 - 任何人?

【问题讨论】:

  • 使用Regex.Matches
  • 我投票决定将此问题作为离题结束,因为这可以通过检查智能感知建议或仅检查 MSDN 上 Regex 对象支持的方法来解决。
  • 我更新了它以更准确地解决我的问题。 Wiktor 回答了最初的问题,但事实证明这对我的实际情况并不适用。

标签: c# .net regex string


【解决方案1】:

您的@"\[\[([^)]*)\]\]" 模式匹配两个连续的[[,后跟零个或多个除) 之外的字符,然后是两个]]。这意味着,如果 )[[...]] 中,则不会匹配。

要处理多字符分隔的子字符串,您可以使用两种方法:惰性点匹配或展开模式。

注意:要获得多个匹配项,请使用我在其他答案中所写的Regex.Matches

1.懒点解决方案

var s = "User name [[sales]] and [[anotherthing]]";
var matches = Regex.Matches(s, @"\[{2}(.*?)]{2}", RegexOptions.Singleline)
        .Cast<Match>()
        .Select(p => p.Groups[1].Value)
        .ToList();

请参阅regex demoRegexOptions.Singleline 修饰符是 . 匹配换行符所必需的。

2。展开的正则表达式解决方案:

var s = "User name [[sales]] and [[anotherthing]]";
var matches = Regex.Matches(s, @"\[{2}([^]]*(?:](?!])[^]]*)*)]{2}")
        .Cast<Match>()
        .Select(p => p.Groups[1].Value)
        .ToList();

有了这个,RegexOptions.Singleline就不用了,效率更高,速度更快。

regex demo

【讨论】:

  • 哇,这太棒了,谢谢!我对您的正则表达式知识印象深刻!
【解决方案2】:

使用Regex.Matches:

在指定的输入字符串中搜索指定正则表达式的所有出现

示例代码:

var matches = Regex.Matches("User name (sales) and (anotherthing)", @"\(([^)]*)\)")
            .Cast<Match>()
            .Select(p => p.Groups[1].Value)
            .ToList();

【讨论】:

  • 这很好用,但是......显然我的正则表达式是垃圾,因为它实际上是用于模式 [[something]] - 并且将 "[[" 替换为 "(" 似乎不是工作正常吗?
  • 如果你有多字符分隔符,单独的否定字符类将无济于事。我将发布另一个答案。
猜你喜欢
  • 1970-01-01
  • 2015-08-01
  • 2015-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多