为什么++
成为-+-+-+-
?
我想用双重操作标志清理一个字符串。我应该如何处理?
String = "++"
print (String ) -- -> ++
String = string.gsub( String, "++", "+")
print (String ) -- -> + ok
String = string.gsub( String, "--", "+")
print (String ) -- -> +++ ?
String = string.gsub( String, "+-", "-")
print (String ) -- -> -+-+-+- ??
String = string.gsub( String, "-+", "-")
print (String ) -- -> -+-+-+- ??? ;-)
答案 0 :(得分:1)
核心问题是gsub
对模式(Lua的最小正则表达式)进行操作,并且您的字符串包含未转义的魔术字符。然而,即使知道我发现自己对你的结果感到惊讶。
如果我们更改替换字符串,则更容易看到gsub正在做什么:
string.gsub('+', '--', '|') => |+|
string.gsub('+++', '--', '|') => |+|+|+|
-
表示“前一个原子出现0次或更多次”。与+
不同,它不贪婪,匹配尽可能少的字符。
我刚试过它,显然“可能性最少的字符”大多数意味着0个字符。例如,我对此的直觉:
string.gsub('aaa','a-', '|')
表达式a-
是否与每个a
相匹配,将其替换为“|”,从而产生“|||”。事实上,它匹配每个字符前后的0长度间隙,导致:'| a | a | a |'
事实上,我们在-
之前的是什么原子并不重要,它总是在最小长度上匹配,0:
string.gsub('aaa','x-', '|') => |a|a|a|
string.gsub('aaa','a-', '|') => |a|a|a|
string.gsub('aaa','?-', '|') => |a|a|a|
string.gsub('aaa','--', '|') => |a|a|a|
您可以看到最后一个是您的情况并解释您的结果。你的下一个结果是完全相同的:
string.gsub('+++','+-','|') => |+|+|+|
您的最终结果更直接:
string.gsub('-+-+-+-','-+','|') => |+|+|+|
在这种情况下,您匹配“原子-
的一次或多次出现”,因此您只需更换-
个字符,就像您期望的那样。