我在使用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$
但是它找到绝对零的字符串。 那么我做错了什么? (一个注意,我把额外的空白放在一边。*这里你可以看到它,但通常空白不会在那里。
答案 0 :(得分:1)
你可能需要非贪婪的方法。试试这个:
^.*?pizza.*$
答案 1 :(得分:0)
所以,现在完成新答案。
搜索“披萨”(不是“披萨”)这个词
如果您有一个多行字符串并想要查找单行,则需要使用选项[Multiline][1]
。这会更改锚点^
和$
的行为,以匹配行的开头和结尾。
为确保仅匹配完整的“披萨”字样且不匹配,请使用word boundaries
如果您不使用Singleline选项,则无需担心贪婪
所以你的正则表达式是:
Regex optionRegex = new Regex(@"^.*\bpizza\b.*$", RegexOptions.Multiline);
对于Sub Page_Load.*End Sub
,您需要匹配多行:
使用single line选项,允许.
匹配也是换行符。
您需要quantifier
所以你的正则表达式是:
Regex optionRegex = new Regex(@"Sub Page_Load.*?End Sub", RegexOptions.Singleline);