2015-09-03 4 views
3

У меня есть строка в JavaScript, который выглядит следующим образом:JavaScript Чередование без скобок

"This {{@is}} a $|test$| string with $|@string$| delimiters {{as}} follows" 

И у меня есть регулярное выражение, которое используется для извлечения строки между $|.*?$| и {{.*?}} следующим образом:

/{{(.*?)}}|\$\|(.*?)\$\|/g 

Пример: https://regex101.com/r/mV3uR1/1

Я хотел бы комбинировать чередование, так что существует только одна соответствующая группа, например:

/{{|\$\|(.*?)}}|\$\|/g 

Но это, кажется, игнорировать мой квантор 0 или 1 раз (?) и он совпадает со всей строкой до ... {{as.

Пример: https://regex101.com/r/qZ7iI5/1

Почему это происходит?

Если я усилить, что регулярное выражение включать круглые скобки следующим образом, он делает работу:

/({{|\$\|)(.*?)(}}|\$\|)/g 

Пример: https://regex101.com/r/fT5qH0/1

Но затем включает фигурные скобки/доллар трубу в моей согласующего группе, которая что я пытаюсь избежать (поскольку я беспокоюсь только о строке между этими разделителями, так что вам нужна только одна соответствующая группа).

Может ли кто-нибудь пролить свет на это, пожалуйста?

ответ

1
(?:{{|\$\|)(.*?)(?:}}|\$\|) 

^^    ^^ 

Вы можете попробовать this.See demo.By сделать другие группы non capturing у вас будет только одна группа.

https://regex101.com/r/cT0hV4/13

Но это будет соответствовать {{asd$| тоже.

Ваше регулярное выражение {{|\$\|(.*?)}}|\$\| будет соответствовать любому из следующих 3 различных строк:

{{

\$\|(.*?)}} #look в начале и в конце этой строки, и вы поймете

$|.

Именно поэтому вы получаете тот матч,

2

Давайте сравним:

работает регулярное выражение:

/({{|\$\|)(.*?)(}}|\$\|)/g 

и не работает регулярное выражение:

/{{|\$\|(.*?)}}|\$\|/g 

В 2 regex (.*?) должен следовать }} и чередование для всей \$\|(.*?)}} суб-шаблон так эффективно это означает совпадение:

{{ ИЛИ \$\|(.*?)}} ИЛИ \$\|

В то время как в первом регулярном выражении группировка чередование правильно применяется до & после того, как из-за (.*?).

Вы можете использовать не-захвата групп, а также:

/(?:{{|\$\|)(.*?)(?:}}|\$\|)/g 

Теперь это означает:

{{ ИЛИ \$\| с последующим (.*?) с последующим }} ИЛИ \$\|.