我正在学习使用正则表达式的黄瓜步骤定义。我遇到了以下不同的用法,并想知道在一对双引号中捕获组的两种方法之间是否存在一些实质性差异:
接近一个:"([^"]*)"
接近两个:"(.*?)"
例如,考虑一个字符串输入:'the output should be "pass!"'
。这两种方法都会捕获pass!
。是否有输入,其中两种方法捕获不同;或者它们是等价的?
由于
答案 0 :(得分:3)
嗯,肉眼看起来一样。但略有不同。看看这个例子:
输入:
a " regex
example is
here" please
"([^"]*)"
的输出:
regex
example is
here
并且"(.*?)"
的输出为空。
.*?
表示除\n
之外的任何字符(0次或更多次),并且引号("
)之间的换行符很少。如果我们在正则表达式中使用它,我们需要为正则表达式引擎提供使用Multiline
匹配的提示。
答案 1 :(得分:2)
"([^"]*)"
也会捕获换行符,所以如果你有
"Something
that goes on two lines"
然后它会匹配它。
"(.*?)"
不会跨越换行符,因此不匹配该词组。
除非您使用单行修饰符(?s)
。在这种情况下,.
还将包含换行符。然后,以下表达式:(?s)"(.*?)"
将匹配并捕获。
答案 2 :(得分:2)
"(.*?)"
和"([^"]*)"
这取决于此正则表达式片段在整个模式的较大上下文中出现的位置。它还取决于正在搜索的目标字符串。例如,给定以下输入字符串:
'foo "quote1" bar "quote2"'
表达式:/"(.*?)"$/
(注意字符串锚点的添加结尾)将匹配:"quote1" bar "quote2"
但/"([^"]*)"$/
表达式将匹配:"quote2"
。
如果必须要获得成功的整体匹配,该点将匹配双引号。