得到正则表达式的一行

时间:2013-04-15 11:59:31

标签: regex

我在使用dot net中的正则表达式做一些简单的事情时遇到了麻烦。 假设我想找到包含“pizza”一词的所有行。我想我会做以下事情:

^ .* pizza .* $

这个想法是第一个字符表示一行的开头,美元符号表示该行的结尾,而点星表示任意数量的字符。 这似乎不起作用。

然后我尝试了其他不起作用的东西。我想我会在我的visual basic项目中找到以“Sub Page_Load”开头并以“End Sub”结尾的所有例程。我搜索了:

 Sub Page_Load .* End Sub

但是这在项目中发现了几乎每个子程序。 换句话说,它并没有限制自己的Page_Load子。 所以我觉得我很聪明,并且注意到每个End Sub都在一行的末尾,所以我要做的就是在它之后放一个$:

 Sub Page_Load .* End Sub$

但是它找到绝对零的字符串。 那么我做错了什么? (一个注意,我把额外的空白放在一边。*这里你可以看到它,但通常空白不会在那里。

2 个答案:

答案 0 :(得分:1)

你可能需要非贪婪的方法。试试这个:

^.*?pizza.*$

答案 1 :(得分:0)

所以,现在完成新答案。

  1. 搜索“披萨”(不是“披萨”)这个词

    1. 如果您有一个多行字符串并想要查找单行,则需要使用选项[Multiline][1]。这会更改锚点^$的行为,以匹配行的开头和结尾。

    2. 为确保仅匹配完整的“披萨”字样且不匹配,请使用word boundaries

    3. 如果您不使用Singleline选项,则无需担心贪婪

    4. 所以你的正则表达式是:

      Regex optionRegex = new Regex(@"^.*\bpizza\b.*$", RegexOptions.Multiline);
      
    5. 对于Sub Page_Load.*End Sub,您需要匹配多行:

      1. 使用single line选项,允许.匹配也是换行符。

      2. 您需要quantifier

      3. 的不匹配行为

        所以你的正则表达式是:

        Regex optionRegex = new Regex(@"Sub Page_Load.*?End Sub", RegexOptions.Singleline);