我从string.scan和几个正则表达式测试人员那里得到了完全不同的结果……
我只是试着从字符串中抓取域名,这是最后一个词。
有问题的正则表达式:
/([a-zA-Z0-9\-]*\.)*\w{1,4}$/字符串(1行,在Ruby的运行时btw中验证)
str = 'Show more results from software.informer.com'工作很好,但在红宝石中...
irb(main):050:0> str.scan /([a-zA-Z0-9\-]*\.)*\w{1,4}$/
=> [["informer."]]我认为我会在software.informer.com上得到匹配,这是我的目标。
发布于 2010-02-16 01:12:42
它看起来不像是您期望的多个结果(特别是当正则表达式被锚定时)。在这种情况下,没有理由使用扫描。
'Show more results from software.informer.com'[ /([a-zA-Z0-9\-]*\.)*\w{1,4}$/ ]
#=> "software.informer.com"如果您确实需要使用scan (在这种情况下,您显然需要删除锚点),您可以使用(?:)创建非捕获组。
'foo.bar.baz lala software.informer.com'.scan( /(?:[a-zA-Z0-9\-]*\.)*\w{1,4}/ )
#=> ["foo.bar.baz", "lala", "software.informer.com"]发布于 2010-02-16 00:57:51
您的正则表达式是正确的,结果与String#scan的行为方式有关。来自the official documentation
如果模式包含组,则每个单独的结果本身都是一个数组,每个组包含一个条目。
基本上,如果将整个正则表达式放在圆括号中,结果中每个数组的第一个元素将是您所期望的。
发布于 2010-02-16 00:54:10
你在software.informer.com上得到了匹配。检查$&的值。scan的返回值是捕获的组的数组。在后缀周围添加捕获括号,您还将获得作为scan返回值的一部分的.com。
正则表达式测试人员和Ruby在根本问题(正则表达式本身)上没有分歧。相反,它们的界面在强调的内容上是不同的。在irb中运行scan时,首先会看到来自scan的返回值(捕获的子模式的数组),它与匹配的文本不同。正则表达式测试人员很可能倾向于显示匹配的文本。
https://stackoverflow.com/questions/2267484
复制相似问题