“[^”] *“和”。+“之间的区别是什么?

时间:2012-09-04 03:47:52

标签: ruby regex cucumber

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

即使在Stack Overflow语法高亮显示中,它也会在第一次出现问题。更常见的第一个例子有什么优点?

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

4 个答案:

答案 0 :(得分:6)

[^“] * 表示除

之外的N(N> = 0)个字符

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

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

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

答案 1 :(得分: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

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

答案 2 :(得分:1)

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

  • ^行首
  • My name is "文字字符串后跟"
  • (启动了一个捕获组
  • [启动角色类
  • ^"在字符类中,^表示“不是”,所以在这种情况下,它意味着除了"
  • 之外的任何内容
  • ]字符类结尾
  • *前面的任意数量,包括0场比赛
  • "引用字符
  • $行尾

第二个,除了你所拥有的角色类[]外,一切都与上面相同:

  • .“任何角色”
  • + 一个或更多前面的

+*之间的区别在于+至少需要其中一个,但*也会匹配,前提是零。

答案 3 :(得分:1)

[^"]表示除"

以外的任何字符

.表示任何字符。

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

+表示至少匹配一次。