У меня есть регулярное выражение, которое возвращает нулевые значения для исключенных слов.Как мне ничего не вернуть? - PullRequest
0 голосов
/ 01 апреля 2019

Учитывая следующую тестовую строку:

{{one}}

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

{{three}}

Я хочу только сопоставить {{one}} и {{two}}.У меня есть следующее регулярное выражение:

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

Это соответствует {{one}} и {{three}}, но также соответствует значению nil (см .: https://rubular.com/r/E4faa6Tze04WnG). Как мне соответствовать только {{one}} и {{three}}, а НЕ значение nil?

(то есть регулярное выражение должно возвращать только два совпадения вместо трех)

Ответы [ 2 ]

1 голос
/ 01 апреля 2019

Я предлагаю сделать это в два шага для размещения более сложных строк. Я предположил, что строки «один» и «три» должны быть извлечены из следующей строки.

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"

Два регулярных выражения условно записываются следующим образом.

r0 = /<([^>]+)>.+?<\/\1>/
r1 = /(?<=\{\{)[^\}]+(?=\}\})/
1 голос
/ 01 апреля 2019

Взято из вашего комментария:

У меня большой объем текста, и я хочу использовать метод gsub в ruby ​​для замены {{tags}}, которые находятся вне тегов <content>.

Это регулярное выражение должно делать то, что вам нужно:

(^{{(?!#|\/).*}}$)

Это соответствует {{one}} и {{three}} и аналогичным интерполяциям по {{tag}}, за исключением следующих: <content>{{tag}}</content>.


Могу ли я игнорировать только теги, а не другие теги?Например, я попробовал это с тегами здесь: rubular.com/r/jTKxwjNuKoSjgN, которые я не хочу игнорировать.

Конечно.Попробуйте это:

(?!<content>)({{(?!#|\/).*?}})(?!<\/content>)

Если вам нужно объяснение того, как и почему это регулярное выражение работает, вы можете взглянуть на раздел объяснений здесь: https://regex101.com/r/d4DEK1/1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...