首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby和regex的问题非常奇怪

Ruby和regex的问题非常奇怪
EN

Stack Overflow用户
提问于 2010-02-16 00:49:08
回答 4查看 122关注 0票数 3

我从string.scan和几个正则表达式测试人员那里得到了完全不同的结果……

我只是试着从字符串中抓取域名,这是最后一个词。

有问题的正则表达式:

代码语言:javascript
复制
/([a-zA-Z0-9\-]*\.)*\w{1,4}$/

字符串(1行,在Ruby的运行时btw中验证)

代码语言:javascript
复制
str = 'Show more results from software.informer.com'

工作很好,但在红宝石中...

代码语言:javascript
复制
irb(main):050:0> str.scan /([a-zA-Z0-9\-]*\.)*\w{1,4}$/
=> [["informer."]]

我认为我会在software.informer.com上得到匹配,这是我的目标。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-16 01:12:42

它看起来不像是您期望的多个结果(特别是当正则表达式被锚定时)。在这种情况下,没有理由使用扫描。

代码语言:javascript
复制
'Show more results from software.informer.com'[ /([a-zA-Z0-9\-]*\.)*\w{1,4}$/ ]
#=> "software.informer.com"

如果您确实需要使用scan (在这种情况下,您显然需要删除锚点),您可以使用(?:)创建非捕获组。

代码语言:javascript
复制
'foo.bar.baz lala software.informer.com'.scan( /(?:[a-zA-Z0-9\-]*\.)*\w{1,4}/ )
#=> ["foo.bar.baz", "lala", "software.informer.com"]
票数 2
EN

Stack Overflow用户

发布于 2010-02-16 00:57:51

您的正则表达式是正确的,结果与String#scan的行为方式有关。来自the official documentation

如果模式包含组,则每个单独的结果本身都是一个数组,每个组包含一个条目。

基本上,如果将整个正则表达式放在圆括号中,结果中每个数组的第一个元素将是您所期望的。

票数 3
EN

Stack Overflow用户

发布于 2010-02-16 00:54:10

你在software.informer.com上得到了匹配。检查$&的值。scan的返回值是捕获的组的数组。在后缀周围添加捕获括号,您还将获得作为scan返回值的一部分的.com

正则表达式测试人员和Ruby在根本问题(正则表达式本身)上没有分歧。相反,它们的界面在强调的内容上是不同的。在irb中运行scan时,首先会看到来自scan返回值(捕获的子模式的数组),它与匹配的文本不同。正则表达式测试人员很可能倾向于显示匹配的文本。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2267484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档