/ / JS regex exec вътрешния низ между разделителите и проверете за разбити ограничители - javascript, regex

JS regex изпълнява вътрешния низ между разделителите и проверява за счупени разделители - javascript, regex

Имам поле за въвеждане във форма, която трябва да проверя за определена маркировка, която имаме.

Разделителят е {!, }.

Бих искал да свържа всичко, което е вътре в ограничителите.

content = /regex/g.exec("{!content}")

по-нататък входният низ може да има повече от една маркировка в него.

input = "{!content} {!other}";
["content","other"] = /regex/g.exec("{!content} {!other}")

Това е първата част от проблема, сега тя стига до забавната част.

Аз също имам, когато някои ограничители за маркиране не са приключили правилно и трябва да проверя и за тях.

В този случай искам да получа:

input = "{!content {!other} {!broken";
["{!content", "other", "{!broken"] = /regex/g.exec(input);

Актуализация * намери случай, при който първоначалното решение от@MikeM не улавя нещо, което бих искал. Ако началният ограничител е сам по себе си, имам нужда тези да се показват в масива с резултати. Ако началният ограничител е в края на низа, той няма да залови.

input = "{!content {!other} {!";
["{!content", "other", "{!"] = /regex/g.exec(input);

Отговори:

2 за отговор № 1

Можете да използвате следното, ако { и } не са позволени в съдържанието

var m,
result = [],
str = "{!content {!other} {!broken",
reg = /{!([^{}]+)}|({![^{}]+)/g;

while ( m = reg.exec( str ) ) {
result.push( m[1] || m[2] );
}

console.log( result );   // [ "{!content ", "other", "{!broken" ]

Това обаче щеше да вземе пространствата след незатворено съдържание.

Update:

За да заснемете съдържание, без да включите някакво пробел за водене или задържане, можете да използвате следното - написано в по-дълга форма за по-голяма яснота.

var m,
result = [],
str = "{!content {!other} {!broken  {!    broken {! content }",
reg = /{!s*([^{}]+?)s*}|{!s*([^{}]+?)s*(?={|$)/g;

m = reg.exec( str );

while ( m != null ) {

if ( m[1] != null ) {
result.push( m[1] );
} else {  // m[2] cannot be null
result.push( "{!" + m[2] );
}
m = reg.exec( str );
}

console.log( result );
// [ "{!content", "other", "{!broken", "content", "{!broken", "content" ]

За повече информация exec, вижте MDN екз.


0 за отговор № 2

Връща масив от съвпадения:

(str.match(/{!.*?.(?=[{}])|{!.+?$/g)||[]).map(function(m){return m.substring(2);});
  • (_.match(...)||[]) е идиом. Мачът се връща null ако не е намерено съвпадение, но обикновено е по-удобно вместо това да се получи празен масив. ||[] поправя това.
  • Редовният израз намира съвпадения между {! и терминатори по алчен начин. Това означава, че търси първата } може да се намери след {!, Също така трябва да бъдем толерантни да се впускаме в несъответстваща отворена скоба { и края на линията и да ги прехвърляте, доколкото е възможно.

    въведете описанието на изображението тук

  • Мачовете от горното винаги започват с {! но нямат ограничител. Единственото нещо, което трябва да се направи, е да го отлепим, така че можем map масива към substring(2), Ако искате да се отървете от пространствата преди и след това, можете да направите това substring(2).trim().