正则表达式在忽略大括号的同时忽略了错误的空白

时间:2018-11-20 01:53:05

标签: ruby regex

我目前正在尝试使用Regex来获取Mustache语法括号内的值,例如

AddModule

我正在尝试选择除大括号以及前后空格(如果用户不小心添加了更多空格)之外的所有内容,或者我想使用组来捕获这3个元素

  • 第1组:“ {”和前导空白
  • 第2组:我们想要的价值
  • 第3组:尾随空白和'}'

到目前为止,我想出了以下Hello {{{ name }}}, {{{greeting}}}. what is your favourite code related website {{ code question website!!! ?? ? }}? here is some random fact {{ random fun fact }},但是如果您检查捕获组,则第二组匹配,然后我们想要的值...哪个好,但后面的空格应该在第三组。即

  • 第1组:“ {”和前导空白
  • 第2组:尾随空白是我们想要的价值
  • 第3组:'}'

Ruby实现 ({{2,3}\s*)([^{}]*)(\s*}{2,3})

2 个答案:

答案 0 :(得分:2)

一种选择是使用以下模式将输入字符串scan \{+\s*([^{}]+)\s*\}+ 匹配成一个数组:

str = "Hello {{{ name }}}, {{{greeting}}}. what is your favourite code related website {{ code question website!!! ?? ? }}? here is some random fact {{ random fun  fact    }}"
arr = str.scan(/\{+\s*([^{}]+)\s*\}+/)
print arr.flatten.collect{|x| x.strip || x }

["name", "greeting", "code question website!!! ?? ?", "random fun  fact"]

这将捕获(大概)嵌套的花括号套之间出现的所有内容。然后,我们可以将该数组展平为单个捕获组中的单个级别的字符串匹配数组,并进行收集,删除前导和尾随空格。

{% block page_js %}

答案 1 :(得分:0)

str = "Hello {{{ name }}}, {{{greeting}}}. what is your favourite code related website {{ code question website!!! ?? ? }}? here is some random fact {{ random fun  fact    }}"

r = /
    {+[ ]*     # match 1+ left braces then 0+ spaces
    \K         # forget everything matched so far
    .+?        # match 1+ characters, lazily
    (?=[ ]*})  # match 0+ spaces then 1 right brace in a positive lookahead
    /x

str.scan(r)
  #=> ["name", "greeting", "code question website!!! ?? ?", "random fun  fact"]

该正则表达式通常是这样写的:

/{+ *\K.+?(?= *})/

在自由空间模式下,在解析表达式之前会删除空格,因此,必须保护作为表达式一部分的空格。我是通过将它们放在角色类中来完成的。或者,可以转义空格。根据要求,可以改为将空白与\s[[:space:]]\p{Space}匹配,或者将空格或制表符与[[:blank:]]\p{Blank}匹配。