Имам поле за въвеждане във форма, която трябва да проверя за определена маркировка, която имаме.
Разделителят е {!
, }
.
Бих искал да свържа всичко, което е вътре в ограничителите.
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()
.