正则表达式似乎返回pos> 1但长度为0

时间:2014-05-12 16:03:11

标签: regex coldfusion

下面的代码在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);

1 个答案:

答案 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提供支持(有限宽度) ,以及(希望)易于使用和一致的功能集与它进行交互。