如何使用正则表达式从字符串中的a到b中拉出所有字符

时间:2016-11-18 00:25:36

标签: ruby regex mediawiki

所以我有一段文字是一个更大的身体的一部分。我试图拉出一个特定的部分......(顺便提一下,文本是MediaWiki代码)。基本上我要做的是替换从{{开始到}} INCLUSIVE结束的所有内容(也应该抓住括号)。

| locator map      = {{Location map|island of Ireland|relief=yes|caption=|float=center|marksize=5|lat= 53.50073|long=-10.14984}}

现在我所拥有的当前ruby REGEX如下所示,如果所有参数都在一行上,则效果很好。如上例所示。

\|\s*locator\smap\s*=\s*\{\{[Ll]ocation map\s*\|(?<map>[A-Za-z0-9\s]*).*caption\s*=\s*(?<caption>[^\|]*).*\}\}

但是,如果参数位于多行(如下面),则正则表达式会中断。

| locator map      = {{Location map
  |Island of Ireland
  |relief=yes|caption=|float=center
  |marksize=5|lat= 53.50073|long=-10.14984
}}
| coords = {{coord|12|12|}}

请注意,REGEX不应选择最后一行。我没有专注于使用正则表达式...如果有更简单的方法来获得我需要的东西,也许使用Ruby的String类,那对我来说没问题!

4 个答案:

答案 0 :(得分:0)

尝试简单的事情:

\|\s*locator\smap[\s\S]+\}\}

演示:https://regex101.com/r/BEUGNn/1

上面的代码可以获得与代码相同的结果。但是,如果您只想匹配问题中指示的大括号{ }之间的内容,则可以尝试Rupy中允许的Regex LookAround函数。试试这段代码:

(?<=\|\slocator\smap\s{6}\=\s\{\{)[\s\S]+\d+(?=\}\})

演示:https://regex101.com/r/2JfrJU/1

答案 1 :(得分:0)

代码

R = /
    (?<={{) # match two left brackets in a positive lookbehind
    .*      # match any number of any character, greedily
    (?=}})  # match two right brackets in a positive lookahead
    /xm  # free-spacing regex definition and multi-line modes

def replace_it(str, replacement)
  str.sub(R, replacement)
end

<强>实施例

str =<<-END
| locator map      = {{Location map
  |Island of Ireland
  |relief=yes|caption=|float=center
  |marksize=5|lat= 53.50073|long=-10.14984
}}
END

str[R]
  #=> "Location map\n      |Island...|long=-10.14984\n    "

replace_it(str, "How now, brown cow?")
  #=> "    | locator map      = {{How now, brown cow?}}\n"

另一个例子:

str = "| locator map = {{pig{{dog}}cat}}"

str[R]
  #=> "pig{{dog}}cat"
replace_it(str, "How now, brown cow?")
  #=> "| locator map = {{How now, brown cow?}}" 

答案 2 :(得分:0)

即使你有嵌套的曲线,你也可以使用Oniguruma的子程序使它工作:

gsub

当然,您也可以使用其他Regexp方法,例如{{1}}。

答案 3 :(得分:0)

在我看来,REGEX是解决任务的更简单方法。这是最短的路。如果你想在多行上使用参数,你应该使用&#34; m&#34;修改。它看起来像这样:/your REGEX here/m。如果您的REGEX选择太长的字符串,则表示您使用贪婪版的量词。贪心量词寻找与模式匹配的最长子串。不是贪婪的量词寻找最短的比赛。对于使用不贪婪的版本put&#34;?&#34;量词之后。对于你的例子

| locator map      = {{Location map
  |Island of Ireland
  |relief=yes|caption=|float=center
  |marksize=5|lat= 53.50073|long=-10.14984
}}
| coords = {{coord|12|12|}}

右REGEX将是:

/\|\s*locator\smap\s*=\s*\{\{[Ll]ocation map\s*\|(?<map>[A-Za-z0-9\s]*).*caption\s*=\s*(?<caption>[^\|]*).*?\}\}/m

互联网上有很棒的项目rubular.com。您可以在此处查看正则表达式。它立即显示结果,没有任何代码编写。即使你不喜欢它,它也能让你的正则表达更快。