Ruby 如何捕获可选的分隔字符串并返回它?
我有: 我想添加一个可选片段,它可以在结果之后捕获一个可选的括号分隔字符串。捕获可以包含任何UTF-8字符,最多包含一个终止端括号。理想情况下:Ruby 如何捕获可选的分隔字符串并返回它?,ruby,regex,Ruby,Regex,我有: 我想添加一个可选片段,它可以在结果之后捕获一个可选的括号分隔字符串。捕获可以包含任何UTF-8字符,最多包含一个终止端括号。理想情况下: "here is BN1234 and other BN456[these are things] and other".scan(/BN([a-zA-Z0-9\-_.]+)/) =>[["1234"], ["456"]] 通过谷歌搜索,我尝试过: "here is BN1234 and other BN456[these are things
"here is BN1234 and other BN456[these are things] and other".scan(/BN([a-zA-Z0-9\-_.]+)/)
=>[["1234"], ["456"]]
通过谷歌搜索,我尝试过:
"here is BN1234 and other BN456[these are things]".scan(???)
=>[["1234"], ["456[these are things]"]]
要获得期望的结果,可选的模式是什么
"here is BN1234 and other BN456[these are other things]".scan(/BN([a-zA-Z0-9\-_.]+\[\d+\])?/)
=> [[nil], [nil]]
你可以查一下
你可以查一下
你可以查一下
您可以检查它如果您从Rubular这样的站点开始,您会发现创建/调试您的模式要容易得多 这是一个起点: 将其应用于
扫描
:
/BN([\w.-]+)(\[[^\]]+\])?/
调整捕获结果的小调整:
'here is BN1234 and other BN456[these are things]'.scan(/BN([\w.-]+)(\[[^\]]+\])?/)
# => [["1234", nil], ["456", "[these are things]"]]
展平结果以消除嵌入的子阵列:
'here is BN1234 and other BN456[these are things]'.scan(/BN([\w.-]+(?:\[[^\]]+\])?)/)
# => [["1234"], ["456[these are things]"]]
在创建模式时,重要的是从简单开始,并尽可能减少视觉噪音。不要使用[a-zA-Z0-9\-.]
,而是学习字符集的工作原理\d
相当于[0-9]
,因此您可以将模式简化为[a-zA-Z\d\-.]
进一步减少,\w
相当于[a-zA-Z0-9\]
,因此模式变为[\w\-.]
最后,应在集合的开始或结束处定义-
内部[]
,因为这样它将自动转义,进一步减少视觉噪音:[\w.-]
我能问一下内部[^]的作用吗
对。你可以问。让我们将其分解:您希望捕获方括号内的文本。要捕获方括号,您必须避开前面的方括号,为了清楚起见,您应该避开后面的方括号<代码>\[^\]+\]是:
=文本开头“\[
”[
=与文本'[^\]]
'不匹配的字符集]
=结束文字'\]
'字符]
或[
,或误用*
或+
,或陷入贪婪问题,都会导致很难找到的bug。编写长模式只会增加打开这些漏洞的可能性,所以要让它们保持短而甜美,测试它们,然后学习如何聚合它们,以重用小的漏洞来创建大的漏洞
Stack Exchange上的一个臭名昭著的字符写了“”,这是一本很好的读物。这本书有一个很好的章节,解释了如何使用模式以及如何以可读/可维护的方式编写模式。还有一个必备的参考资料“”。您不必了解关于模式的所有信息,但要有“MRE”当你们有问题的时候,这本书会给你们一个很好的地方去看。若你们从一个像Rubular这样的网站开始,你们会发现创建/调试你们的模式要容易得多 这是一个起点: 将其应用于
扫描
:
/BN([\w.-]+)(\[[^\]]+\])?/
调整捕获结果的小调整:
'here is BN1234 and other BN456[these are things]'.scan(/BN([\w.-]+)(\[[^\]]+\])?/)
# => [["1234", nil], ["456", "[these are things]"]]
展平结果以消除嵌入的子阵列:
'here is BN1234 and other BN456[these are things]'.scan(/BN([\w.-]+(?:\[[^\]]+\])?)/)
# => [["1234"], ["456[these are things]"]]
创建模式时,重要的是简单地开始,并尽可能减少视觉噪音。不要使用[a-zA-Z0-9\-.]
,而是学习字符集的工作方式。\d
相当于[0-9]
,因此可以将模式减少为[a-zA-Z\-.]
进一步减少,\w
相当于[a-zA-Z0-9\]
,因此模式变为[\w\-.]
最后,应在集合的开始或结束处定义-
内部[]
,因为这样它将自动转义,进一步减少视觉噪音:[\w.-]
我能问一下内部[^]的作用吗
是的。你可以问。让我们把它分解一下:你想捕获方括号内的文本。要捕获方括号,你必须转义前导方括号,为清楚起见,你应该转义尾随方括号。\[^\]+\]
是:
=文本开头“\[
”[
=与文本'[^\]]
'不匹配的字符集]
=结束文字'\]
'字符]
或[
,或误用*
或+
,或陷入贪婪问题,都会导致很难找到的bug。编写长模式只会增加打开这些漏洞的可能性,所以要让它们保持短而甜美,测试它们,然后学习如何聚合它们,以重用小的漏洞来创建大的漏洞
Stack Exchange上的一个臭名昭著的字符写了“”,这是一本很好的读物。这本书有一个很好的章节,解释了如何使用模式以及如何以可读/可维护的方式编写模式。还有一个必备的参考资料“”。您不必了解关于模式的所有信息,但要有“MRE”当你们有问题的时候,这本书会给你们一个很好的地方去看。若你们从一个像Rubular这样的网站开始,你们会发现创建/调试你们的模式要容易得多 这是一个起点
str = "here is BN1234 and other BN456[these are other things]"
str.scan(/(?:^|\s)BN(\d+(?:\[[^\]]+\])?)/i)
#=> [["1234"], ["456[these are other things]"]]