使用ColdFusion reFindNoCase列出字符串中的所有标点符号

时间:2014-03-06 22:43:28

标签: regex coldfusion coldfusion-9

我无法使用reFindNoCase输出所有标点符号列表,方法是使用POSIX字符类[:punct:]或它所代表的实际字符列表来调用它,当然这里显示的是:{{3} }

我希望reFindNoCase在以下示例中为每个呈现的字符提供字符串中的位置和位置列表,但事实并非如此:

    var strRegexString = "!""##$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~";
    var reObjMatchPunctuation = reFindNoCase("([!""##$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~])", LOCAL.strRegexString, 1, True);
    LOCAL.reObjMatchPunctuation._match = [];
    for (var i=1; i <= arrayLen(LOCAL.reObjMatchPunctuation.pos); i++){
        if (LOCAL.reObjMatchPunctuation.pos[i] == 0){
            arrayAppend(LOCAL.reObjMatchPunctuation._match, "NO MATCH");
        }else if (LOCAL.reObjMatchPunctuation.len[i] == 0){
            arrayAppend(LOCAL.reObjMatchPunctuation._match, "ZERO-LENGTH MATCH");
        }else{
            arrayAppend(LOCAL.reObjMatchPunctuation._match, mid(LOCAL.strRegexString, LOCAL.reObjMatchPunctuation.pos[i], LOCAL.reObjMatchPunctuation.len[i]));
        }
    }
    writeDump(LOCAL.reObjMatchPunctuation);

将正则表达式从上面更改为此也可以获得相同的结果:

var reObjMatchPunctuation = reFindNoCase("([[:punct:]])", LOCAL.strRegexString, 1, True);

以上代码段的结果在下面应该有36个匹配,但不是这样:

Dump of LOCAL.reObjMatchPunctuation

使用cfregex.net中的cfRegex和以下代码段会产生我期望用reFindNoCase实现的目标:

    var strRegexString = "!""##$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~]";
    var reObjMatchPunctuation = new cfc.cfregex.regex("(\p{Punct})");
    WriteDump(LOCAL.reObjMatchPunctuation.find(LOCAL.strRegexString,1,0,"info"));

哪个输出:

(长图) http://www.regular-expressions.info/posixbrackets.html

哪个是对的。我的语法有问题吗? reFind和/或reFindNoCase是否存在已知错误?

注意: 我使用了Adam Cameron的博文中的一部分代码片段来简化查看结果:Output of dump from LOCAL.reObjMatchPunctuation

1 个答案:

答案 0 :(得分:1)

我只是更仔细地查看了您的代码。你的断言是不正确的。 find函数只能找到目标字符串中字符串/正则表达式的第一个匹配项。所以你的find操作就是这样:找到该正则表达式中的第一个匹配项,这是字符串中的第一个字符。您返回的数组有两个元素,因为您的正则表达式中有一个子表达式捕获(()),因此数组中的第一个元素是整个匹配;第二个是子表达式。在这种情况下,相同的单个字符。

要实现您想要实现的目标,您需要将reFind()(不需要reFindNoCase(),因为您不是在寻找字母字符)进入循环,并逐步推进查找操作的起点(即:第三个参数)。

或使用reMatch(),例如:

stringToInspect = "!""##$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~";

regex = "[[:punct:]]";
matches = reMatch(regex, stringToInspect);
writeDump(var=matches, label="Using #regex#");

regex = "[#stringToInspect#]";
matches = reMatch(regex, stringToInspect);
writeDump(var=matches, label="Using #regex#");

请注意,此处的两个示例均 35 匹配...您的原始测试字符串重复](位于\\\之后的中间,并且在结尾处再次)