Это ужасное регулярное выражение! .*
и .*?
означают совпадение с таким количеством (жадных) или с таким количеством (ленивым) всего. Они должны использоваться только в качестве крайней меры. Неправильное использование приведет к катастрофическому возврату , когда регулярное выражение не сможет соответствовать введенному тексту. Все, что вам нужно понять об этом регулярном выражении, это то, что вы не хотите писать регулярные выражения, подобные этому.
Позвольте мне показать, как я бы подошел к проблеме. Очевидно, Формат файла iCalendar основан на строках. Каждая строка имеет свойство и значение, разделенные двоеточием. Свойство может иметь параметры, которые отделены от него точкой с запятой. Это означает, что свойство не может содержать разрывы строк, точки с запятой или двоеточия, что необязательные параметры не могут содержать разрывы строк или двоеточия, и что значение не может содержать разрывы строк. Эти знания позволяют нам написать эффективное регулярное выражение, которое использует отрицательные символьные классы :
([^\r\n;:]+)(;[^\r\n:]+)?:(.+)
Или в ActionScript:
var matches:Array = data.match(/([^\r\n;:]+)(;[^\r\n:]+)?:(.+)/);
p.name = matches[1];
p.value = matches[3];
p.paramString = matches[2];
Как объяснил RegexBuddy:
Match the regular expression below and capture its match into backreference number 1 «([^\r\n;:]+)»
Match a single character NOT present in the list below «[^\r\n;:]+»
Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
A carriage return character «\r»
A line feed character «\n»
One of the characters “;:” «;:»
Match the regular expression below and capture its match into backreference number 2 «(;[^\r\n:]+)?»
Between zero and one times, as many times as possible, giving back as needed (greedy) «?»
Match the character “;” literally «;»
Match a single character NOT present in the list below «[^\r\n:]+»
Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
A carriage return character «\r»
A line feed character «\n»
The character “:” «:»
Match the character “:” literally «:»
Match the regular expression below and capture its match into backreference number 3 «(.+)»
Match any single character that is not a line break character «.+»
Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»