我无法使用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个匹配,但不是这样:
使用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
答案 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 匹配...您的原始测试字符串重复]
(位于\\\
之后的中间,并且在结尾处再次)