返回Ruby正则expression式的第一个匹配
我正在寻找一种方法来在Ruby中对string进行正则expression式匹配,并在第一次匹配时将其短路。
我正在处理的string很长,看起来像标准方式( match
方法)将处理整个事情,收集每个匹配,并返回包含所有匹配的MatchData对象。
match = string.match(/regex/)[0].to_s
你可以尝试variableName[/regular expression/]
。 这是来自irb的输出示例:
irb(main):003:0> names = "erik kalle johan anders erik kalle johan anders" => "erik kalle johan anders erik kalle johan anders" irb(main):004:0> names[/kalle/] => "kalle"
你可以使用[]
:(这就像是match
)
"foo+account2@gmail.com"[/\+([^@]+)/, 1] # matches what is inside () # => "account2" "foo+account2@gmail.com"[/\+([^@]+)/, 0] # matches whole regexp # => "+account2"
如果只有一场比赛的存在是重要的,你可以去
/regexp/ =~ "string"
无论哪种方式, match
应该只返回第一个命中,而scan
search整个string。 所以如果
matchData = "string string".match(/string/) matchData[0] # => "string" matchData[1] # => nil - it's the first capture group not a second match
正则expression式(正则expression式)不过是一个有限状态机(FSM)。
FSM试图回答“这个状态是否可行?
它一直试图进行模式匹配,直到find匹配(成功),或者直到探索到所有path并且找不到匹配(失败)。
成功的时候,这个问题是否可行? 已经回答了“是”。 因此不需要进一步匹配,正则expression式返回。
看到这个和这个更多的这个。
进一步: 这里是一个有趣的例子来演示如何正则expression式的作品。 在这里,一个正则expression式用来检测给定数是否为素数。 这个例子是在Perl中,但它也可以用ruby编写。
我还不确定这个function是真棒还是完全疯狂,但你的正则expression式可以定义局部variables。
/\$(?<dollars>\d+)\.(?<cents>\d+)/ =~ "$3.67" #=> 0 dollars #=> "3"