2016-07-14 79 views
3

我开始喜欢这个项目在电子表格:作用ColdFusion的正则表达式-ING逻辑奇怪

spreadsheetPic

注意不同大小的破折号 ..较长的一个许可证日期之后。 Chr(8211)如果我是正确的。

我打开电子表格转换为查询:

queryPic

我得到一个单元格的值和正则表达式是第一位出来。 (正则表达式模式似乎有点多,但它的工作原理)

//i make a new query and set one cell 
querysetcell(newquery,"permitDateHeader",rereplace(cellWithPermitDate, 
    "^[(\W)]*(\w)*(\s)*(\w)*(\s)*(\w)*(:| -| –)+","","all"), insertRow); 

不过,我还是离开了我这一点:

wrongoutput

通知正则表达式的建筑类型的工作只有两个小破折号。

rightoutput

所以我创建了一个测试页面.CFM(这个其他的东西是在一个控制器上运行)

number = "Permit Number: 2016-1"; 
date = "- Permit Date – January 13, 2016"; 
reformednumber = rereplace(number,"^[(\W)]*(\w)*(\s)*(\w)*(\s)*(\w)*(:| -| –)+","","all"); 
reformeddate = rereplace(date,"^[(\W)]*(\w)*(\s)*(\w)*(\s)*(\w)*(:| -| –)+","","all"); 
writeDump(reformednumber); 
writeDump(reformeddate); 

而这就是转储:

pagedump

许可证日期已成功解析。这一次在.cfm页面而不是在控制器中,并将其放入查询中。这是我看到的唯一区别。同样的正则表达式。

这是怎么发生的?

可能的解决方案只是改变正则表达式。我只是不想提取属于\ W范围的值,例如美元符号。

如果无法重新创建那么它可能是太“专用”的错误可留在了论坛。

+1

由于您只想放弃模式的第一次出现,您可能想要移除'rereplace'中的''all''参数。 – Alex

+1

如果你认为这个长连字符是char(8211),为什么你在正则表达式中不考虑这个?顺便说一下,ColdFusion asc()函数会告诉你这个字符实际是什么。 –

+0

@DanBracuk 你是对的,但我尝试过,并留下@%〜或一些奇怪的字符来代替输出中的短划线。没有玩那么多。 –

回答

1

我是还不能确定为什么会发生这种情况,但是这个编辑正则表达式似乎有修复了它

^[(\W)]*(\w)*(\s)*(\w)*(\s)*(\w)*(\s)*(\W)? 
//used(\W)? at the end rather than (:| -| –)+ 
+0

宽的短划线'''可能在您的正则表达式中编码不正确。如果在没有BOM的情况下保存,CF往往会在模板中搞乱Unicode。 – Alex

+0

因为我们遇到过类似空间的unicode字符的问题,所以我会推荐使用\“而不是”“。偶尔从MS产品复制并粘贴数值时,会引入“不间断空间”。该值不可见,也不会使用CF的trim()自动修剪。 –

+0

@Alex是否使用字符代码修复? –