ruby正则表达式匹配字符串的结尾

时间:2014-07-24 18:35:59

标签: ruby regex

我今天在某地读到,SO中的正则表达式标签最能“给我ze代码”类型的问题,所以我谨慎地问......我试过了,但是如果这是重复的话请告诉我所以我可以删除。

[First]sometext[Second]

我想在Ruby中使用Regex在第二个[]:

之间返回值
Second

我到目前为止:

(?<=\[)(.*)(?=\])

返回

First]sometext[Second

\[.*?(\[)

此分组将返回

[First]sometext[

所以我一直在努力以某种方式混合两者但没有运气..希望有人可以提供帮助。

我在SO中找到的最接近的参考文献是在“正则表达式中匹配第二次或第n次出现”中搜索的,我无法在我的问题上使用它。

我的解决方法是使用gsub将[First]和“”替换为初始字符串:

\[(.*?)\]

再做另一场比赛..但我想知道如何使用正则表达式。

5 个答案:

答案 0 :(得分:4)

> s = "ipsum[First]sometext[Second]lorem"
=> "ipsum[First]sometext[Second]lorem"
> s =~ /\[.*?\].*?\[(.*?)\]/
=> 5
> $1
=> "Second"

答案 1 :(得分:3)

为什么不在开头.*使用贪婪的搜索,以便尽可能多地捕获?

^.*\[(.*?)\]

Demo

然后,您可以通过将?添加为^.*?来使其变得非贪婪(仅捕获第一个[...]块中的内容)。

答案 2 :(得分:1)

有很多方法可以解决这个问题。尚未提及的是输入锚$的结束。

s = "[First]sometext[Second]"
s.match(/[\[][^\[]+[\]]$/)  # => #<MatchData "[Second]">
s.match(/[\[]([^\[]+)[\]]$/)  # => #<MatchData "[Second]" 1:"Second">

这仅适用于[something]结束字符串的特定情况。

“锚点”部分介绍了$\z\Z之间的微妙差异。

http://www.ruby-doc.org/core-2.1.2/Regexp.html

答案 3 :(得分:0)

你很亲密。使用此选项捕获第一个捕获组中的相关部分,然后使用$1

访问它

.*?\[.*?\[(.*?)\].*

答案 4 :(得分:0)

如果您只想让最后一个[..]所包含的文本包含在可能包含任意数量的[..]的字符串中,这可能会更方便。 [编辑:我会留下这个,但是@OnlineCop对于我在上一句中描述的目标有更好的解决方案。这也是原始问题的绝佳答案。]

反转字符串,然后搜索带有正则表达式的子字符串,该正则表达式捕获非捕获组]中的(?:\]),捕获捕获组1中的*.?({{1}使它变得非贪婪)并在第二个非捕获组中捕获?。最后,检索并反转捕获组1中包含的字符串:

[