Lua中%w与%W的正则匹配差异问询
Lua 正则中%w与%W的核心差异
先明确最关键的两点:
- %w:匹配单个单词字符,等价于字符集
[a-zA-Z0-9_],涵盖大小写英文字母、数字和下划线。 - %W:是%w的完全补集,匹配任何非单词字符,等价于
[^a-zA-Z0-9_],比如空格、换行符\n、标点符号、中文等都属于这类。
结合你给出的代码例子理解:
代码
Str = string.gsub(Str, "%f[%w]cat%f[%W]")
这里的%f是边界断言,%f[%w]匹配一个位置(该位置紧跟的是单词字符),%f[%W]匹配紧跟非单词字符的位置,目的是精准匹配独立的"cat"单词,避免匹配到"category"这类包含"cat"的长单词。代码
for _ in string.gmatch("\n" .. Str .. "\n", "%Wcat%W") do
给字符串前后拼接\n,是为了处理字符串开头/结尾的"cat"(比如字符串直接以"cat"开头时,前面原本没有字符,加\n后就有了非单词字符来满足%W的匹配),整体是用非单词字符包裹的规则来定位独立的"cat"。代码
if Pos1 == 0 or string.find(Str, "^%W", Pos1) then^%W是从Pos1位置开始匹配非单词字符,用来判断当前位置要么是字符串起始点,要么是非单词字符开头。
纠正你的误解:
%W和「大写单词字符」没有任何关系,如果要匹配大写字母,应该用%u(Lua正则中%u专门匹配单个大写英文字母)或者直接写字符集[A-Z]。
内容的提问来源于stack exchange,提问作者haytham-med
相关产品推荐
相关产品推荐

