【问题标题】:regular expression for trailing . at the end of a string尾随的正则表达式。在字符串的末尾
【发布时间】:2013-10-30 17:12:17
【问题描述】:

我们目前一直在使用我们从 cflib.org 使用的 UDF,虽然它是一个很棒的 UDF,可以将字符串更改为美观,但我们似乎无法弄清楚如何使其允许尾随“。”如果输入,则在字符串的末尾。

<cffunction name="friendlyURL" output="false" access="public" returntype="string" hint="returns a URL safe string">
<cfargument name="string" default="" type="string">
<cfscript>
var returnString = arguments.string;
var InvalidChars = "à,ô,d,?,ë,š,o,ß,a,r,?,n,a,k,s,?,n,l,h,?,ó,ú,e,é,ç,?,c,õ,?,ø,g,t,?,e,c,s,î,u,c,e,w,?,u,c,ö,è,y,a,l,u,u,s,g,l,ƒ,ž,?,?,å,ì,ï,?,t,r,ä,í,r,ê,ü,ò,e,ñ,n,h,g,d,j,ÿ,u,u,u,t,ý,o,â,l,?,z,i,ã,g,?,o,i,ù,i,z,á,û,þ,ð,æ,µ,e,À,Ô,D,?,Ë,Š,O,A,R,?,N,A,K,S,?,N,L,H,?,Ó,Ú,E,É,Ç,?,C,Õ,?,Ø,G,T,?,E,C,S,Î,U,C,E,W,?,U,C,Ö,È,Y,A,L,U,U,S,G,L,ƒ,Ž,?,?,Å,Ì,Ï,?,T,R,Ä,Í,R,Ê,Ü,Ò,E,Ñ,N,H,G,Ð,J,Ÿ,U,U,U,T,Ý,O,Â,L,?,Z,I,Ã,G,?,O,I,Ù,I,Z,Á,Û,Þ,Ð,Æ,?,E";
var ValidChars   = "a,o,d,f,e,s,o,ss,a,r,t,n,a,k,s,y,n,l,h,p,o,u,e,e,c,w,c,o,s,o,g,t,s,e,c,s,i,u,c,e,w,t,u,c,oe,e,y,a,l,u,u,s,g,l,f,z,w,b,a,i,i,d,t,r,ae,i,r,e,ue,o,e,n,n,h,g,d,j,y,u,u,u,t,y,o,a,l,w,z,i,a,g,m,o,i,u,i,z,a,u,th,dh,ae,u,e,A,O,D,F,E,S,O,A,R,T,N,A,K,S,Y,N,L,H,P,O,U,E,E,C,W,C,O,S,O,G,T,S,E,C,S,I,U,C,E,W,T,U,C,Oe,E,Y,A,L,U,U,S,G,L,F,Z,W,B,A,I,I,D,T,R,Ae,I,R,E,Ue,O,E,N,N,H,G,D,J,Y,U,U,U,T,Y,O,A,L,W,Z,I,A,G,M,O,I,U,I,Z,A,U,TH,Dh,Ae,U,E";
// trim the string
returnString = Trim(returnString);
returnString = StripCR(returnString);
// replace known characters with the corresponding safe characters
returnString = ReplaceList(returnString,InvalidChars,ValidChars);
// replace unknown characters in the x00-x7F-range with x's
returnString = returnString.ReplaceAll('[^\x00-\x7F]','x');
// Replace one or many comma with a dash
returnString = returnString.ReplaceAll(',+', '-');
// Other substitutions
returnString = Replace(returnString, "%", "percent","ALL");
returnString = Replace(returnString, "&amp;", " and ","ALL");
returnString = Replace(returnString, "&", " and ","ALL");
returnString = returnString.ReplaceAll('[:,/]', '-');
// Replace one or more whitespace characters with a dash
returnString = returnString.ReplaceAll('[\s]+', '-');
// And everything else simply has to go
returnString = returnString.ReplaceAll('[^A-Za-z0-9\/-]','');
// finally replace multiple dash characters with just one
returnString = returnString.ReplaceAll('-+','-');
// we're done
return returnString;
</cfscript>
</cffunction>

我的正则表达式,不是很好,我已经花了几个小时修补它,但似乎仍然无法弄清楚如何让它有一个尾随的“。”如果输入了一个。

【问题讨论】:

    标签: regex coldfusion friendly-url


    【解决方案1】:
    // And everything else simply has to go
    returnString = returnString.ReplaceAll('[^A-Za-z0-9\/-]','');
    

    这会将不属于集合的任何字符替换为空字符串。 尝试在集合末尾添加. 字符:

     returnString = returnString.ReplaceAll('[^A-Za-z0-9.-]','');
    

    注意:正如@PeterBoughton 所指出的,/ 已经被 - 取代,因此它不必是字符集的一部分。

    现在,这将允许 . 字符出现在字符串的中间,而您只想在末尾允许它们,因此您必须替换任何不在末尾的 . 字符。

    returnString = returnString.replaceAll('\.(?!$)', '');
    

    否则,您始终可以尝试匹配一个 . 后跟任何字符,并使用反向引用将这两个字符替换为该字符。

    returnString = returnString.replaceAll('\.(.)', '\1');
    

    【讨论】:

    • 你犯了和我一样的错误。你想要'[^A-Za-z0-9\/.-]' 而不是'[^A-Za-z0-9\/-.]'- 必须是集合中的最后一个字符。
    • Right ;) 没有注意到有一个- char hehe。固定!
    • 当然,如果连字符被转义,则定位不会成为问题。此外,/ 确实 not 需要转义 - 尽管考虑到前面的行将所有 / 更改为 - 无论如何它都是多余的,所以可能只是 [^A-Za-z0-9\-.]
    • 是的,CF 确实支持前瞻(但不支持后瞻) - 但是,调用 string.replaceAll 方法正在使用 Java 的正则表达式(两者都支持)。
    • @PeterBoughton 不错。我还没有真正看过其他替代品在做什么;)
    【解决方案2】:

    这一行

        // And everything else simply has to go
        returnString = returnString.ReplaceAll('[^A-Za-z0-9\/-]','');
    

    删除不是A-Za-z0-9/- 的所有内容。

    [] 括号包含可能匹配的字符列表,^ 表示“不”)。

    您应该可以将. 添加到列表中:

        // And everything else simply has to go
        returnString = returnString.ReplaceAll('[^A-Za-z0-9\/.-]','');
    

    (正如@Leigh 在下面提到的,. 必须在最后的- 之前,否则它将被视为一个范围。)

    【讨论】:

    • . 添加到末尾不会“允许在字符串的末尾处有一个尾随句点”。此外,上面的表达式甚至无法编译。
    • 它确实“允许在字符串末尾有一个尾随句点”。
    • 好吧,它现在没有做任何事情,因为它没有编译;)但我的看法是 OP 希望在字符串末尾允许它 only 。 {耸耸肩}不过我可能是错的。 (编辑)没关系,我看到它已被编辑以修复编译错误。
    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 2018-06-18
    相关资源
    最近更新 更多