在黄瓜步骤定义中使用以下两个语句有什么区别?当我在 Rubular 中测试它们时,它们都适用于我能想象到的所有情况。在第二种情况下,我的语法突出显示更可能看起来不错(没有额外的双引号来搞砸)。
即使在 Stack Overflow 语法高亮显示中,它也会一开始就搞砸了。更常见的第一个示例的优点是什么?
Given /^My name is "([^"]*)"$/ do |myname|
Given /^My name is "(.+)"$/ do |myname|
[^"]*表示 N (N>=0) 个字符,除了"
.+表示 N (N>0) 个字符,包括"
如果主题超过 1 个字符,并且没有引号 ( " ),则两个正则表达式模式是相等的。
但是,考虑这个字符串:My name is "special_name_contain_"_laugh"
再次运行你的模式,它们不一样:)
当提供以下内容时,第一个不会中断:
My name is "Henry James" and some other condition is "something else"
第一个正则表达式将带引号的字符串中的字符限制为非引号字符 - 因此它只会拾取Henry James
. 第二个正则表达式匹配一个引号字符,后跟其他任何字符(包括其他引号字符),然后是一个结束引号字符 - 所以myname
在第二种情况下是:
Henry James" and some other condition is "something else
这意味着您的测试用例中只能有一个带引号的值 - 这比第一个正则表达式的限制更具限制性(您只能有不包含引号字符的带引号的值)。
我不是红宝石大师,但是第一个正则表达式的意思是:
^
线的开始My name is "
后跟 a 的文字字符串"
(
启动捕获组[
开始一个字符类^"
在字符类中,^
表示“不”,所以在这种情况下,它意味着除了 a"
]
字符类结束*
前面的任意数量,包括 0 个匹配项"
引号字符$
行结束第二个,一切都和上面一样,除了[]
你有的字符类:
.
“任何字符”+
上述一项或多项+
和之间的区别在于*
,+
至少需要前面的一个,但*
如果前面的为零,也将匹配。
[^"]
表示任何字符,除了"
.
表示任何字符。
*
表示匹配任何时间包括 0。
+
表示至少匹配 1 次。