0

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

^ .* pizza .* $

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

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

 Sub Page_Load .* End Sub

但这在项目中发现了几乎每个子程序。换句话说,它并不局限于 Page_Load 子。所以我想我会很聪明,并注意到每个 End Sub 都在一行的末尾,所以我所要做的就是像这样在它后面放一个 $:

 Sub Page_Load .* End Sub$

但这会发现绝对为零的字符串。那么我做错了什么?(请注意,我在 .* 周围放置了额外的空白,以便您可以看到它,但通常不会出现空白。

4

2 回答 2

1

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

^.*?pizza.*$

于 2013-04-15T12:02:39.947 回答
0

所以,现在完成新的答案。

  1. 搜索单词“pizza”(不是“pizzas”)

    1. 如果您有一个多行字符串并且想要查找单行,则需要使用 Option [Multiline][1]。这会改变锚的行为^$匹配行的开始和结束。

    2. 为确保仅匹配完整的单词“pizza”而不匹配部分匹配,请使用单词边界

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

    所以你的正则表达式是:

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

    1. 使用单行选项,以允许.匹配换行符。

    2. 您需要量词的不贪婪匹配行为

    所以你的正则表达式是:

    Regex optionRegex = new Regex(@"Sub Page_Load.*?End Sub", RegexOptions.Singleline);
    
于 2013-04-15T12:25:45.427 回答