Drugmix wrote:
2. в этом правиле жадность не слушается:
Code: Select all
0 "^\s*(?:\}\s*)*(?:(Else)(?:\s*,\s*|\s+|\s*\{\s*)|(.+(?=::))::)?(?:(Try)(?:\s*,\s*|\s+|\s*\{\s*))?\s*(Click)(?:(?:\s*,\s*|\s+)([^;,]|(?<=`),|(?<!\s);)*)?(?:\s*+,\s*+([^;,]|(?<=`),|(?<!\s);)*+)?(?:\s*,\s*([^;,]|(?<=`),|(?<!\s);)*)?((?<=\s);.*)?$" "\1=(4,${IF},0) \2=(4,${STR},0) \3=(2,${OP},0) \4=(0,${OP},0) \5=(0,${TYPE},#ff0000) \6=(0,${TYPE},#00ff00) \7=(0,${TYPE},#0000ff) \8=(3,${COMM},0)"
должно в строке "Click,red,green" слово "green" подкрашивать зелёным фоном, а подкрашивает синим. В правиле овер-жадность выставлена как раз для фразы после второй запятой, но её всё равно перебивает под-правило для подкрашивания после третьей запятой, хоть у этого под-правила и не используется овер-жадность и оно бы должно перебиваться соседним под-правилом с овер-жадностью.
Кхм, всё дело в группах и нежадном квантификаторе "?". Проверяться должны все возможные варианты, а из-за того, что группы, по сути не являются жадными (хоть внутри у них и есть жадные квантификаторы), то захват происходит последним совпадающим шаблоном, при прочих равных...
Чтобы добиться желаемого, правило надо модифицировать, примерно так:
Code: Select all
0 "^\s*(?:\}\s*)*(?:(Else)(?:\s*,\s*|\s+|\s*\{\s*)|(.+(?=::))::)?(?:(Try)(?:\s*,\s*|\s+|\s*\{\s*))?\s*(Click)(?:(?:\s*,\s*|\s+)([^;,]|(?<=`),|(?<!\s);)*){,1}+(?:\s*+,\s*+([^;,]|(?<=`),|(?<!\s);)*+){,1}+(?:\s*,\s*([^;,]|(?<=`),|(?<!\s);)*)?((?<=\s);.*)?$" "\1=(4,${IF},0) \2=(4,${STR},0) \3=(2,${OP},0) \4=(0,${OP},0) \5=(0,${TYPE},#ff0000) \6=(0,${TYPE},#00ff00) \7=(0,${TYPE},#0000ff) \8=(3,${COMM},0)"
вместо "{,1}+" вполне сгодится и "?+", но так, имхо, нагляднее...
PS Эмм, а на этой странице уже есть ответ

... ну да ладно, пусть и этот остается.