我试图学习正则表达式,但仍然没有任何线索。我有这行代码,它成功地分隔了占位符' 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。正确的字符组合如何?
答案 0 :(得分:2)
/
不需要转义,除非您将其用作模式分隔符。:
@"(?<FirstWord>.*?)/>>(?<OtherText>.*?)\"
此外,您的上一个\
基本上会转义应该结束字符串的"
(c#-wise:将其删除):
@"(?<FirstWord>.*?)/>>(?<OtherText>.*?)"
并且由于您希望最有可能在字符串结束之前进行提取(.*?
将获取满足表达式所需的较少字符数),您应该在结尾处使用$
或使用任何字符串其他类型的分隔符(whitspace,linebreak等)。
@"(?<FirstWord>.*?)/>>(?<OtherText>.*?)$"
示例:
(.*?)/>>(.*?)$
删除尾随$
将获取第二个匹配组的空字符串,因为""
是可能满足表达式.*?
的最短字符串
(.*?)/>>(.*?)$
上的 This/>>Test One
将与This
和Test One
匹配
(.*?)/>>(.*?)\s
上的 This/>>Test One
将与This
和Test
匹配
(.*?)/>>(.*?)
上的 This/>>Test One
将与This
和""
匹配
注意:我说“”是有可能满足表达式的最短字符串。?*故意!频繁的错误解释是将.*?a
解释为“一切直到”:
(.*?)a$
将 NOT 无法匹配 - 它将返回cab
!,因为{{1 cab
后面跟着满足表达式AND a
是任何匹配可能的最短字符串。cab
匹配 - 但正则表达式从左到右工作,因此一旦找到b
就会中止 - 即使cab
会更短。