gpt4 book ai didi

ruby - 如何使用 ruby​​ 和/或正则表达式获取匹配括号内的所有文本

转载 作者:太空宇宙 更新时间:2023-11-03 16:17:23 25 4
gpt4 key购买 nike

我正在清理一些代码,需要确保我的 gsub! 只在一小部分代码上运行。我需要检查的代码部分以 {{Infobox television 开始(\{\{[Ii]nfobox\s[Tt]elevision 是技术性的)并结束带有匹配的双括号“}}”。

将要运行的 gsub! 示例是 text.gsub!(/\|(\s*)channel\s*=\s*(.*)\n/, "|\\1network =\\2\n")

...
{{Infobox television
| show_name = 60 Minutos
| image =
| director =
| developer =
| channel = [[NBC]]
| presenter = [[Raúl Matas]] (1977–86)<br />[[Raquel Argandoña]] (1979–81)
| language = [[Spanish language|Spanish]]
| first_aired = {{Date|7 April 1975}}
| website = {{url|https://foo.bar.com}}
}}
...

注意:

  • 使用 sub 而不是 gsub 不是一种选择,因为可能存在需要替换的参数的多个实例。
  • 我不能只查找第一组 }},因为可能有多个组,如上例所示。

最佳答案

您可以使用带有一点递归的正则表达式:

/(?=\{\{[Ii]nfobox\s[Tt]elevision)(\{\{(?>[^{}]++|\g<1>)*}})‌​/

或者,如果有单个 {}在内部,您还需要将那些与 (?<!{){(?!{)|(?<!})}(?!}) 相匹配:

/(?=\{\{[Ii]nfobox\s[Tt]elevision)(\{\{(?>[^{}]++|(?<!{){(?!{)|(?<!})}(?!})|\g<1>)*}})/

参见 Rubular demo

详细信息:

  • (?=\{\{[Ii]nfobox\s[Tt]elevision) - 确保当前位置后跟 {{Infobox television 的正面前瞻像字符串(不同大小写)
  • (\{\{(?>[^{}]++|\g<1>)*}})‌​ - 第 1 组符合以下条件:
    • \{\{ - 一个 {{子串
    • (?>[^{}]++|\g<1>)* - 出现零次或多次:
    • [^{}]++ - 除 { 以外的 1 个或多个字符和 }
    • (?<!{){(?!{) - 一个 {未附上其他 {
    • (?<!})}(?!}) - 一个 }未附上其他 }
    • | - 或者
    • \g<1> - 整个第 1 组子模式
    • }} - 一个 }}子串

关于ruby - 如何使用 ruby​​ 和/或正则表达式获取匹配括号内的所有文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40748280/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com