给出以下测试字符串:
{{one}}
<content>{{two}}</content>
{{three}}
我只想匹配{{one}}和{{two}}。我有以下正则表达式:
{{((?!#)(?!\/).*?)}}|(?:<content\b[^>]*>[^<>]*<\/content>)
与{{one}}和{{three}}匹配,但也与nil值匹配(请参阅:https://rubular.com/r/E4faa6Tze04WnG)。如何只匹配{{one}}和{{three}}而不匹配nil值?
(也就是说,正则表达式只能返回两个匹配项,而不是三个)
答案 0 :(得分:1)
来自您的评论:
我有大量文本,我想使用ruby的gsub方法替换
<content>
标签之外的{{tags}}。
此正则表达式应该做什么,您需要做什么:
(^{{(?!#|\/).*}}$)
这与{{one}}
和{{three}}
以及相似的插值àla{{tag}}
匹配,除了以下内容:<content>{{tag}}</content>
。
我可以仅忽略标签,而不忽略其他标签吗?例如,我在这里尝试了以下标签:rubular.com/r/jTKxwjNuKoSjgN,我不想忽略它。
当然。试试这个:
(?!<content>)({{(?!#|\/).*?}})(?!<\/content>)
如果您需要解释此正则表达式的工作方式和原因,可以在此处查看解释部分:https://regex101.com/r/d4DEK1/1
答案 1 :(得分:1)
我建议分两步进行以适应更复杂的字符串。我假设要从以下字符串中提取字符串“一”和“三”。
final CountDownLatch latch = new CountDownLatch(1);
Runnable task = () -> {
try {
// ... do useful work
} finally {
latch.countDown();
}
}
executorObject.execute(task);
// wrap into try/catch for InterruptedException
// if not propagating further
latch.await(); // await(timeout);
str = <<-_
{{one}}
<content>cats {{two}} and <content2>{{four}}</content2> dogs</content>
{{three}}
_
r0 = /
<
([^>]+) # match >= 1 characters other than '>' in capture group 1
>
.+? # match one or more characters lazily
<\/ # match '<' then forward slash
\1 # match the contents of capture group 1
>
/x # free-spacing regex definition mode
r1 = /
(?<=\{\{) # match '{{' in a positive lookbehind
[^\}]+ # match any number of characters other than '}'
(?=\}\}) # match '}}' in a positive lookahead
/x # free-spacing regex definition mode
第一步是:
str.gsub(r0, '').scan(r1)
#=> ["one", "three"]
这当然可以在字符串的第二行很简单的情况下起作用
str.gsub(r0, '')
#=> "{{one}}\n\n{{three}}\n"
两个正则表达式通常按如下方式编写。
"<content>{{two}}</content>\n"