2015-07-30 3 views
0

Я выделяю все слова между трубами |, используя /\|(.+?)\|/g, например |mathSign|; mathSign будет освещен.Регулярное выражение: совпадение, если не следует повторяющийся символ

Тем не менее, есть некоторые случаи, которые мы пишем двойные трубы || для другого значения следующим образом:

function |mathSign| (x) { 
    return |((x === 0 || isNaN(x)) ? x : (x > 0 ? 1 : -1))|; 
} 

картина соответствует |((x === 0 | и | isNaN(x)) ? x : (x > 0 ? 1 : -1))| что неправильно. Правильный должен игнорировать || посередине.

Я попытался использовать концепцию lookahead; /\|(.+?)\|(?!\|)/g, чтобы проигнорировать, если труба, за которой следует другая труба, однако, пока не повезло. Любая помощь будет оценена по достоинству.

См. Мой Demo в действии.

ответ

1

Думаю, вы имели в виду это,

\|((?:\|\||[^|])+)\| 
  • \|\| - Матч с жадностью, когда || появляется.
  • | - ИЛИ
  • [^|] - Матч любой символ, но не |
  • + - один или несколько раз.

DEMO

var s = "function |mathSign| (x) {\n  return |((x === 0 || isNaN(x)) ? x : (x > 0 ? 1 : -1))|; \n }"; 
 
alert(s.match(/\|((?:\|\||[^|])+)\|/g))

+0

Благодаря @Avanash, работал как шарм! – lvarayut

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