Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何捕获可选的分隔字符串并返回它?_Ruby_Regex - Fatal编程技术网

Ruby 如何捕获可选的分隔字符串并返回它?

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

我有:

我想添加一个可选片段,它可以在结果之后捕获一个可选的括号分隔字符串。捕获可以包含任何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]".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.-]

我能问一下内部[^]的作用吗

对。你可以问。让我们将其分解:您希望捕获方括号内的文本。要捕获方括号,您必须避开前面的方括号,为了清楚起见,您应该避开后面的方括号<代码>\[^\]+\]是:

  • \[
    =文本开头“
    [
  • [^\]]
    =与文本'
    ]
    '不匹配的字符集
  • \]
    =结束文字'
    ]
    '字符
关于正则表达式模式,有一些非常重要的东西需要学习和记住。它们非常强大,但并不是所有存在的计算/解析问题的答案。我遇到的每一个程序员,当他们了解regex时,都会立即尝试尽可能地使用它们。这不是一个好的决定,因为编写逻辑中有漏洞的模式非常容易,而且通常非常严重。未能转义
[
,或误用
*
+
,或陷入贪婪问题,都会导致很难找到的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.-]

我能问一下内部[^]的作用吗

是的。你可以问。让我们把它分解一下:你想捕获方括号内的文本。要捕获方括号,你必须转义前导方括号,为清楚起见,你应该转义尾随方括号。
\[^\]+\]
是:

  • \[
    =文本开头“
    [
  • [^\]]
    =与文本'
    ]
    '不匹配的字符集
  • \]
    =结束文字'
    ]
    '字符
关于正则表达式模式,有一些非常重要的东西需要学习和记住。它们非常强大,但并不是所有存在的计算/解析问题的答案。我遇到的每一个程序员,当他们了解regex时,都会立即尝试尽可能地使用它们。这不是一个好的决定,因为编写逻辑中有漏洞的模式非常容易,而且通常非常严重。未能转义
[
,或误用
*
+
,或陷入贪婪问题,都会导致很难找到的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]"]]