下面的代码在Mid上返回一个错误,说第三个参数是-2 - 所以它认为长度是0.我们完全不知道如何发生这种情况。代码在花括号之间查找值并将其去除。你能想出打破这个的方法吗? Str可以是任何东西 - 我们不知道,它不是由我们提供的 - 所以这就是你要破坏的变种。
str = "Here's a string with {EmailAddy} and maybe some {otherVariables}";
start = 1;
pos = 0;
length = 0;
tokens = ArrayNew(1);
while(true) {
x = REFind("\{\w*\}", str, start, true);
pos = x.pos[1];
length = x.len[1];
if (pos == 0) {
break;
} else {
// get the token, trimming the curly brackets
token = mid(str, pos+1, length-2);
arrayAppend(tokens, token);
start = pos + length;
}
}
WriteDump(tokens);
答案 0 :(得分:0)
你不需要lookbehind:
var Tokens = rematch( "\{\w*(?=\})" , Arguments.Str );
for ( var i = 1 ; i LTE ArrayLen(Tokens) ; i++ )
Tokens[i] = Tokens[i].substring(1);
return Tokens;
并且该代码还应该为您提供关于代码中断的最可能原因的线索,因为您可能已经在持久化组件中的函数中获得它,但是(没有任何作用域)一切都在组件的变量范围内,因此它不是线程安全的 - 并且 - 在加载下多次调用 - 所涉及的变量可能会被破坏。
这是您应该在整个代码中寻找的一般问题 - 通常,函数内每个变量的第一个赋值都应该以{{1}}关键字(或明确的var
范围为前缀)作为前缀确保它是该功能的本地,而不是组件的全局。 (当然,在需要全局变量的情况下。)
哦,如果你真的想要/需要在CF中使用lookbehind,我已经创建了cfRegex,一个包装Java更强大的正则表达式引擎的库,为lookbehind提供支持(有限宽度) ,以及(希望)易于使用和一致的功能集与它进行交互。