2016-05-15 3 views
1

У меня есть некоторые выражения регулярных выражений для размещения содержимого между тегом, как видно из результата. Если я применить то же регулярное выражения выражения по приведенному тексту я буду получать тег внутри тегов ...Совпадение не между тегами

Оригинального содержания:

Lorem Ipsum 123456 Dolor сидеть @twitter Амета, consectetur adipiscing Элиты примера.

РЕЗУЛЬТАТ:

Lorem Ipsum [тел] 123456 [/ тел] Dolor сидеть [TW] @twitter [/ Tw] Амет, consectetur adipiscing Элит [а] пример [/ а].

РЕЗУЛЬТАТ ВТОРОЙ РАЗ:

Lorem Ipsum [тел] [тел] 123456 [/ телефон] [/ тел] Dolor сидеть [TW] [TW] @twitter [/ TW] [/ tw] amet, consectetur adipiscing elit [a] [a] пример [/ a] [/ a].

Что добавить в выражения регулярных выражений, чтобы они не совпадали, если контент находится между любыми [] и [/]?

+0

Попробуйте добавить '(?! \ [\/[^]] *])' до конца ваших шаблонов регулярных выражений. –

+0

Ответ ниже - обходной путь, а не решение. –

ответ

0

Описание

(?:[0-9]+|twitter|consectetur)(?![0-9a-z]*\[\/[a-z]+\]) 

Заменить: [xx]$0[/XX]

Regular expression visualization

Это регулярное выражение будет делать следующее:

  • найти все строки чисел, слово twitter, и слово consectetur. Я выбрал эти подстроки, чтобы проиллюстрировать регулярное выражение, но они могут быть заменены другими строками.
  • убедитесь, что слово уже не следует закрывающему тег
  • избежать крайних случаев
    • конструкции [0-9+] будет соответствовать 2345, который находится в исходной строке, но она может уже быть завернута по тэгам
    • согласующих twitter без ведущего @ все еще имеет косой тег

Пример

Демо

https://regex101.com/r/lW2pY6/1

Образец текста

123456 Lorem Ipsum [тел] 123456 [/ тел] Dolor сидеть [TW] @twitter [/ TW ] amet, consectetur adipiscing elit [a] пример [/ a]

образца после замены

[XX] 123456 [/ XX] Lorem Ipsum [тел] 123456 [/ тел] Dolor сидеть [TW] @twitter [/ TW] Амет, [XX] consectetur [/ XX ] adipiscing Элит [а] пример [/ а]

Объяснение

NODE      EXPLANATION 
---------------------------------------------------------------------- 
    (?:      group, but do not capture: 
---------------------------------------------------------------------- 
    [0-9]+     any character of: '0' to '9' (1 or more 
          times (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
    |      OR 
---------------------------------------------------------------------- 
    twitter     'twitter' 
---------------------------------------------------------------------- 
    |      OR 
---------------------------------------------------------------------- 
    consectetur    'consectetur' 
---------------------------------------------------------------------- 
)      end of grouping 
---------------------------------------------------------------------- 
    (?!      look ahead to see if there is not: 
---------------------------------------------------------------------- 
    [0-9a-z]*    any character of: '0' to '9', 'a' to 'z' 
          (0 or more times (matching the most 
          amount possible)) 
---------------------------------------------------------------------- 
    \[      '[' 
---------------------------------------------------------------------- 
    \/      '/' 
---------------------------------------------------------------------- 
    [a-z]+     any character of: 'a' to 'z' (1 or more 
          times (matching the most amount 
          possible)) 
---------------------------------------------------------------------- 
    \]      ']' 
---------------------------------------------------------------------- 
)      end of look-ahead 
Смежные вопросы