Най-големият проблем е да знаете дали гледате екранирана скоба (\[
) или скоба, която следва екранирана обратна наклонена черта (\\[
). Това е достатъчно лесно, ако търсите само едно съвпадение:
/^[^\]\[\\]*(?:\\.[^\]\[\\]*)*(\[[^\]\[]+\])/
Първата част поглъща всички знаци, различни от обратни наклонени черти или квадратни скоби. Ако види обратна наклонена черта, хваща този и следващия знак, какъвто и да е той. Той повтаря този процес толкова пъти, колкото може, и когато вече не може да прави това, следващото нещо трябва да бъде стойността в скоби (или "таг"), която търсите. Заловен е в група №1.
Получаването на останалите тагове е по-трудно. За да останете в синхрон с данните, искате всяко следващо съвпадение да започва точно там, където е спряло предишното съвпадение. Много разновидности на регулярни изрази поддържат \G
котвата точно за тази цел, но това не ни помага. JavaScript е в процес на приемане на флага /y
, който прави по същество същото, но все още не можете да разчитате на това.
Ето заобиколно решение, което трябва да работи за случая:
/(?:^|\[[^\]\[]+\])[^\]\[\\]*(?:\\.[^\]\[\\]*)*(?=(\[[^\]\[]+\]))/g
Основният регулярен израз е същият, но групата за улавяне вече е вътре в поглед напред. Първият път започва да съвпада в началото на низа, както преди, но спира малко преди първия таг. Предварителният преглед потвърждава, че маркерът е наличен, но не го консумира. Следващото съвпадение започва с повторно съпоставяне на етикета, като този път го консумира. Междувременно етикетът също се записва в група #1, така че можете да получите достъп до него по обичайния начин.
var regex = /(?:^|\[[^\]\[]+\])[^\]\[\\]*(?:\\.[^\]\[\\]*)*(?=(\[[^\]\[]+\]))/g;
var match = regex.exec(subject);
while (match != null) {
// tag is in match[1]
match = regex.exec(subject);
}
person
Alan Moore
schedule
24.06.2013
/\[.*\]/g
- person hugomg   schedule 24.06.2013