为什么++变成 - + - + - + - :string.gsub“奇怪”的行为

时间:2015-07-16 18:16:18

标签: replace lua

为什么++成为-+-+-+-

我想用双重操作标志清理一个字符串。我应该如何处理?

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 ) -- -> -+-+-+- ??? ;-)

1 个答案:

答案 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('-+-+-+-','-+','|') => |+|+|+|

在这种情况下,您匹配“原子-的一次或多次出现”,因此您只需更换-个字符,就像您期望的那样。