我正在使用Regex搜索文件并查找“夹在”其他两个字符串之间的字符串。这是我目前的代码:
openingstring.*?closingstring
我遇到的问题是它正在搜索文件中的多行。假设我想在“foo”和“bar”之间找到任何内容,我的文件看起来像这样:
foo this is NOT the string I want
foo this is the string I want bar
我的正则表达式返回两行,当我想要它只返回第2行。
如何才能获得foo
和bar
位于同一行的字符串?
我还应该注意,这不是在文本编辑器中,也不是在编程语言中完成,而是在自动化软件的用户界面中完成。
答案 0 :(得分:2)
""应该匹配除新行之外的任何字符,你使用哪种语言?
无论如何,你可以尝试这样的事情:
foo[^\r\n]*bar
请注意,您不需要"?"在哪里" *"本身意味着0或更多。
答案 1 :(得分:1)
如果.*?
首先找到foo,那么.
显然是贪婪的情况就是这样,它会直到它找到下一个栏。这只会发生,在这种情况下,如果点[^\r\n]*?
表示Dot-All。你应该尝试关闭它。或者,如果您别无选择,请使用.*?
代替Dot子句{{1}}
答案 2 :(得分:1)
为什么不使用内联修饰符?m
?
(?m)foo.*bar
或者,要覆盖Singleline
模式,?m-s
:
(?m-s)foo.*bar
答案 3 :(得分:0)
正则表达式引擎将从“从左到右”处理字符串。
由于输入字符串以foo
开头,因此引擎将在第一次尝试时开始匹配。 Nothing 告诉引擎它不应该与表达式foo
的第二个.*?
匹配 - 所以它会继续发现bar
:
foo .*? bar
foo this is NOT the string I want foo this is the string I want bar
完美匹配。
总是一个好主意排除打开和关闭字符串,以便在模式中匹配,以实现最短的匹配:
模式foo((?!foo|bar).)*bar
将匹配foo
和bar
之间的任何内容,如果它既不包含foo
也不包含bar
:
foo((?!foo|bar).)*bar