2

在黄瓜步骤定义中使用以下两个语句有什么区别?当我在 Rubular 中测试它们时,它们都适用于我能想象到的所有情况。在第二种情况下,我的语法突出显示更可能看起来不错(没有额外的双引号来搞砸)。

即使在 Stack Overflow 语法高亮显示中,它也会一开始就搞砸了。更常见的第一个示例的优点是什么?

Given /^My name is "([^"]*)"$/ do |myname|
Given /^My name is "(.+)"$/ do |myname|
4

4 回答 4

6

[^"]*表示 N (N>=0) 个字符,除了"

.+表示 N (N>0) 个字符,包括"

如果主题超过 1 个字符,并且没有引号 ( " ),则两个正则表达式模式是相等的。

但是,考虑这个字符串:My name is "special_name_contain_"_laugh" 再次运行你的模式,它们不一样:)

于 2012-09-04T04:02:39.463 回答
5

当提供以下内容时,第一个不会中断:

My name is "Henry James" and some other condition is "something else"

第一个正则表达式将带引号的字符串中的字符限制为非引号字符 - 因此它只会拾取Henry James. 第二个正则表达式匹配一个引号字符,后跟其他任何字符(包括其他引号字符),然后是一个结束引号字符 - 所以myname在第二种情况下是:

Henry James" and some other condition is "something else

这意味着您的测试用例中只能有一个带引号的值 - 这比第一个正则表达式的限制更具限制性(您只能有不包含引号字符的带引号的值)。

于 2012-09-04T03:51:56.363 回答
1

我不是红宝石大师,但是第一个正则表达式的意思是:

  • ^线的开始
  • My name is "后跟 a 的文字字符串"
  • (启动捕获组
  • [开始一个字符类
  • ^"在字符类中,^表示“不”,所以在这种情况下,它意味着除了 a"
  • ]字符类结束
  • *前面的任意数量,包括 0 个匹配项
  • "引号字符
  • $行结束

第二个,一切都和上面一样,除了[]你有的字符类:

  • .“任何字符”
  • + 上述一项或多项

+和之间的区别在于*+至少需要前面的一个,但*如果前面的为零,也将匹配。

于 2012-09-04T03:56:53.390 回答
1

[^"]表示任何字符,除了"

.表示任何字符。

*表示匹配任何时间包括 0。

+表示至少匹配 1 次。

于 2012-09-04T03:57:51.843 回答