Ruby 正则表达式与可能的空字符串匹配

Ruby 正则表达式与可能的空字符串匹配,ruby,regex,Ruby,Regex,我想得到A=[和第一个封闭]之间的任何东西: 到目前为止还不错 但是,对于A=[]: 如何获得一个空字符串,而不是[B=[boy?使用。*?而不是.+?。前者匹配零个或多个字符,而后者匹配一个或多个字符 "Hello A=[] B=[boy] World".match(/A*=*\[(.*?)\]/)[1] # => "" 我会使用: str = "Hello A=[apple] B=[boy] World" str[/A=\[(.*?)\]/, 1] # => "apple" s

我想得到A=[和第一个封闭]之间的任何东西:

到目前为止还不错

但是,对于A=[]:

如何获得一个空字符串,而不是[B=[boy?

使用。*?而不是.+?。前者匹配零个或多个字符,而后者匹配一个或多个字符

"Hello A=[] B=[boy] World".match(/A*=*\[(.*?)\]/)[1] # => ""
我会使用:

str = "Hello A=[apple] B=[boy] World"
str[/A=\[(.*?)\]/, 1] # => "apple"
str = "Hello A=[] B=[boy] World"
str[/A=\[(.*?)\]/, 1] # => ""
我不知道你为什么要使用*=*,因为它意味着零个或多个“A”后跟零个或多个“=”,基本上没有做任何有用的事情,事实上,实际上打开了一个漏洞返回坏结果。请参阅下面编辑中的附加信息

以下是相同主题的变体。所有变体都记录在和文档中:

str = "Hello A=[apple] B=[boy] World"
str[/A=\[(.*?)\]/, 1] # => "apple"

/A=\[(.*?)\]/ =~ str 
$1 # => "apple"

str =~ /A=\[(.*?)\]/
$1 # => "apple"

/A=\[(?<in_brackets>.*?)\]/ =~ str
in_brackets # => "apple"

str = "Hello A=[] B=[boy] World"
str[/A=\[(.*?)\]/, 1] # => ""

/A=\[(.*?)\]/ =~ str 
$1 # => ""

/A=\[(?<in_brackets>.*?)\]/ =~ str 
in_brackets # => ""
将是正确的,如下所示:

/A ?= ?/
以下是一些测试,向您展示发生了什么:

str = "Hello [foo] A = [apple] B=[boy] World"
str[/A*=*\[(.*?)\]/, 1] # => "foo"
str[/A *=*\[(.*?)\]/, 1] # => nil
str[/A *= *\[(.*?)\]/, 1] # => "apple"
str[/A ?= ?\[(.*?)\]/, 1] # => "apple"
请注意,您的模式/A*=*/允许引擎匹配[foo],而不是A=[apple]。这是因为您告诉它匹配no A和no=作为一个选项,这打开了抓取[foo]的孔。只要您的输入正好是两个选项,并且括号内没有前面的值,您就安全了。如果您有这样的输入,您的结果将是错误的

str[/A.*=.\[.*?\]/,1]

没有:


我建议探索如何使用regex via。下面是它失败的原因。

Ah!我怎么能忘记它呢?;方括号语法很好看。*=*用于匹配等号前后可能的空格字符,例如str=Hello A=[]B=[boy]World。然后您应该在示例字符串中记录这些内容。而且,A*=*不适用于可能的空格,因此任何使用它们的答案都是错误的。请参阅我答案中的编辑部分以获得解释。感谢/A*=*/fix。我编辑了问题以澄清它。
/A *= */
/A ?= ?/
str = "Hello [foo] A = [apple] B=[boy] World"
str[/A*=*\[(.*?)\]/, 1] # => "foo"
str[/A *=*\[(.*?)\]/, 1] # => nil
str[/A *= *\[(.*?)\]/, 1] # => "apple"
str[/A ?= ?\[(.*?)\]/, 1] # => "apple"
str = "Hello A=[apple] B=[boy] World"
str[/A.*=.*\[(.*?)\]/,1] # => "boy"