2016-08-18 3 views
0

Мне нужно совместить в некотором тексте некоторый узор, но этот шаблон не должен иметь другого шаблона. Я использую в html некоторые группы, а html-страница не добавляет новую строку. Вместо новой строки в html добавлено
, поэтому я получаю проблемы здесь.Как правильно исключить группу в регулярном выражении?

Я пытаюсь использовать это регулярное выражение:

/\|([^\r\n|]+?(?!<br>))\|/igm 

и пример есть:

test1 | test2 | test3<br>| test4<br>| test5 |<br>test6 

Должен быть соответствующим только | test2 | и группа test2, но сейчас также соответствие | test4<br>| и не права | test5 |. Мне нужно исключить соответствие test4, но не знаю, как использовать его с [], потому что он игнорировал (?!<br>).

P.S. конечно | test2 | также может быть | text1 <span ...>text2</span> text3 |, поэтому размещение <> в [] не является решением, в котором я нуждаюсь.

+0

Пожалуйста, покажите пример строки (конкретные примеры) вместо непонятных описаний –

+0

@CasimiretHippolyte, это хороший пример. 1) Я получаю объект, что мне нужно для редактирования. 2) Получите innterHTML и примените функцию '.replace()' с этим регулярным выражением. Проблема в какой-то ситуации не должна быть выбрана. Как я уже сказал, HTML содержит '
', а не '\ r \ n', и я не могу исключить только символ новой строки, потому что
- это группа из 4 символов, а не одна. – XCanG

+0

@XCanG: вы имеете в виду '\ | (? :(?! ) [^ \ r \ n |]) * \ |'? См. [This regex demo] (https://regex101.com/r/fU2xF9/1). –

ответ

0

Регулярное выражение вам нужно должно быть основано на tempered greedy token:

/\|((?:(?!<br\s*\/?>)[^\r\n|])*)\|/gi 
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

Смотрите regex demo

маркер (?:(?!<br\s*\/?>)[^\r\n|])* и он соответствует любому символу, чем CR/LF/| ([^\r\n|] отрицается класс классов учитывает это), который не запускает последовательность тегов <br> (или <br > или <br/> или <br /> и т. д.) Содержимое, совпадающее с токеном ar e, захваченных в группу №1, поскольку она завернута скользящими скобками (...).

JS демо:

var re = /\|((?:(?!<br\s*\/?>)[^\r\n|])*)\|/ig; 
 
var str = 'test1 | test2 | test3<br>| test4<br>| test5 |<br>test6|'; 
 
var res = []; 
 
while ((m = re.exec(str)) !== null) { 
 
    res.push(m[1]); // Grab Group 1 value only 
 
} 
 
console.log(res);

Смежные вопросы