我有一个正则表达式返回零值排除词。我如何不返回任何东西呢?

时间:2019-04-01 00:24:50

标签: regex ruby

给出以下测试字符串:

{{one}}

<content>{{two}}</content>

{{three}}

我只想匹配{{one}}和{{two}}。我有以下正则表达式:

{{((?!#)(?!\/).*?)}}|(?:<content\b[^>]*>[^<>]*<\/content>)

与{{one}}和{{three}}匹配,但也与nil值匹配(请参阅:https://rubular.com/r/E4faa6Tze04WnG)。如何只匹配{{one}}和{{three}}而不匹配nil值?

(也就是说,正则表达式只能返回两个匹配项,而不是三个)

2 个答案:

答案 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"