如何正确结合特殊字符使用正则表达式的*SKIP功能?
问题分析
你的正则核心思路是用(*SKIP)(?!)跳过不符合条件的情况,但存在两个关键问题:
- 原正则开头的
\b对?和=无效——这两个是非单词字符,无法触发单词边界,导致包含? float或= float的分支根本匹配不到,自然无法跳过。 - 去掉
\b后,分支里的(?:\s+\w+)*\s+要求必须有空格,无法匹配=float或?float这种无空格的紧连场景,导致这些情况没被跳过,进而被后面的正向预查误匹配。
解决方案
调整正则中排除分支的空白匹配逻辑,允许禁止前缀与类型之间有0个或多个空白字符,同时确保分支能覆盖所有需要排除的场景:
(?:(?:highp|lowp|mediump|return|\?|\=)\s*(?:\w*\s*)*\b(float|(?:i|b)?vec[2-4]|mat[2-4](?:x[2-4])?))(*SKIP)(?!)|(?=\b(float|(?:i|b)?vec[2-4]|mat[2-4](?:x[2-4])?))
关键修改点:
- 移除开头无效的
\b,让?和=能被正常匹配 - 将
(?:\s+\w+)*\s+替换为\s*(?:\w*\s*)*:允许禁止前缀与目标类型之间有0个或多个空白字符,同时兼容前缀后可能出现的其他单词 - 保留
(*SKIP)(?!)逻辑,确保所有匹配到的排除场景被跳过,只匹配剩下的合法类型位置
验证效果:
- 被排除的场景:
? float x;、=float(1.0f)、return vec3;、highp mat4 - 被匹配的场景:
float x;、ivec2 y;、mat3x3 z;
内容的提问来源于stack exchange,提问作者Fox1942
相关产品推荐
相关产品推荐

