正则表达式捕获多字符分隔符

时间:2014-10-06 19:58:04

标签: c# regex match special-characters

我试图学习正则表达式,但仍然没有任何线索。我有这行代码,它成功地分隔了占位符' FirstWord'通过' {'以下所有文字的分隔符:

var regexp = new Regex(@"(?<FirstWord>.*?)\{(?<TextBetweenCurlyBrackets>.*?)\}");

哪个读取此字符串没有问题:

  

问候{Hello World}

我想要做的是更换&#39; {&#39;像一个字符链,例如&#39; /&gt;&gt;&#39; 所以我试过了:

var regexp = new Regex(@"(?<FirstWord>.*?)\/>>(?<OtherText>.*?)\");

我删除了最后一个括号,并用&#39; /&gt;&gt;&#39;替换了第一个括号。但它会抛出ArgumentException。正确的字符组合如何?

1 个答案:

答案 0 :(得分:2)

/不需要转义,除非您将其用作模式分隔符。:

    @"(?<FirstWord>.*?)/>>(?<OtherText>.*?)\"

此外,您的上一个\基本上会转义应该结束字符串的"(c#-wise:将其删除):

    @"(?<FirstWord>.*?)/>>(?<OtherText>.*?)"

并且由于您希望最有可能在字符串结束之前进行提取(.*?将获取满足表达式所需的较少字符数),您应该在结尾处使用$或使用任何字符串其他类型的分隔符(whitspace,linebreak等)。

    @"(?<FirstWord>.*?)/>>(?<OtherText>.*?)$"

示例:

(.*?)/>>(.*?)$

Regular expression visualization

Debuggex Demo

删除尾随$将获取第二个匹配组的空字符串,因为""是可能满足表达式.*?的最短字符串

(.*?)/>>(.*?)$上的

This/>>Test One将与ThisTest One匹配

(.*?)/>>(.*?)\s上的

This/>>Test One将与ThisTest匹配

(.*?)/>>(.*?)上的

This/>>Test One将与This""匹配

注意:我说“”是有可能满足表达式的最短字符串。?*故意!频繁的错误解释是将.*?a解释为“一切直到”:

  • 默认情况下,正则表达式是贪婪的!
  • 在“caba”上搜索表达式(.*?)a$ NOT 无法匹配 - 它将返回cab !,因为{{1 cab后面跟着满足表达式AND a任何匹配可能的最短字符串。
  • 有人可能还希望cab匹配 - 但正则表达式从左到右工作,因此一旦找到b就会中止 - 即使cab会更短。