所以我有一段文字是一个更大的身体的一部分。我试图拉出一个特定的部分......(顺便提一下,文本是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类,那对我来说没问题!
答案 0 :(得分:0)
尝试简单的事情:
\|\s*locator\smap[\s\S]+\}\}
演示:https://regex101.com/r/BEUGNn/1
上面的代码可以获得与代码相同的结果。但是,如果您只想匹配问题中指示的大括号{ }
之间的内容,则可以尝试Rupy中允许的Regex LookAround函数。试试这段代码:
(?<=\|\slocator\smap\s{6}\=\s\{\{)[\s\S]+\d+(?=\}\})
答案 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。您可以在此处查看正则表达式。它立即显示结果,没有任何代码编写。即使你不喜欢它,它也能让你的正则表达更快。