红宝石中的Regexp - 我可以使用括号而不进行分组吗?

时间:2011-05-13 13:21:53

标签: ruby regex

我有以下形式的正则表达式:

/(something complex and boring)?(something complex and interesting)/

我对第二个括号的内容感兴趣;第一个只是为了确保正确的匹配(因为无聊的部分可能存在或可能不存在,但如果存在,我会偶然将它与正则表达式匹配到有趣的部分)。

所以我可以使用$ 2访问第二场比赛。然而,为了与其他正则表达式的一致性,我正在使用我希望以某种方式$ 1将包含第二个parethesis的内容。有可能吗?

5 个答案:

答案 0 :(得分:18)

使用非捕获组:

r = /(?:ab)?(cd)/

答案 1 :(得分:9)

这是一个非ru​​by regexp功能。使用/(?:something complex and boring)?(something complex and interesting)/(请注意?:)来实现此目的。

顺便说一句,在Ruby 1.9中,您可以执行/(something complex and boring)?(?<interesting>something complex and interesting)/并使用$~[:interesting]访问该组;)

答案 2 :(得分:2)

是的,请使用?:语法:

/(?:something complex and boring)?(something complex and interesting)/

答案 3 :(得分:1)

我不是红宝石开发者,但我知道其他正则表达式。所以我打赌你可以使用非捕获组

/(?:something complex and boring)?(something complex and interesting)/

只有一个捕获组,因此$ 1

HTH

答案 4 :(得分:-4)

不是,不。但是您可以使用命名组来实现一致性,如下所示:

/(?<group1>something complex and boring)?(?<group2>something complex and interesting)/

您可以更改名称(尖括号中的文字)以获得您想要达到的一致性。然后,您可以访问这样的组:

string.match(/(?<group1>something complex and boring)?(?<group2>something complex and interesting)/) do |m|
    # Do something with the match, m['group'] can be used to access the group
end