As you all know, in ColdFusion, when you want to do a find or replace with no case sensitivity, you just append "NoCase" to the method call. We have all used:
As you well know (if you follow my blog), I am a huge fan of using the Java String methods for regular expression find and manipulation. The problem with that though is that there is no "NoCase" type methods built into the Java string (except for String::equalsIgnoreCase(), but that doesn't use regular expressions). I thought the only way to work around this was to either put all characters in regular expression (ie [a-zA-Z]), but it turns out there is a flag for performing a case-insensitive search:
(?i)
How did I miss that? I have been doing regular expressions for a long time now and this one has escaped me. Crazy! But, it's so awesome. You just put the flag (?i) in your regular expression and everything to the right of it will be case-insensitive:
Launch code in new window » Download code as text file »
The first method outputs NO... the second method outputs YES. How freakin' cool is that. You can even perform case insensitive sub-strings:
Launch code in new window » Download code as text file »
This also outputs YES.
So anyway, that's pretty freakin' cool! I don't know how I missed that when learning Regular Expressions, but now that I know, it is sooo on.
Oh, and just be careful. This is only for JAVA regular expressions. If you try to use this type of notation in ColdFusion method calls, it will throw an error:
Malformed regular expression "(?i:libby)[a-z ]+(?i:hot)". Reason: Sequence (?:...) not recognized.
... Just another reason I am huge fan of using the underlying Java methods.
Download Code Snippet ZIP File
Comments (7) | Post Comment | Ask Ben | Permalink | Other Searches | Print Page
So what exactly are the benefits of using the Java string classes? Is it just a performance issue?
Posted by Seb Duggan on Sep 30, 2006 at 10:50 AM
It can be a performance issue, but it's also a utility issues. As I describe above, the regular expression methods used on the Java string class:
String::Matches()
String::ReplaceFirst()
String::ReplaceAll()
... allow for much more powerful AND faster regular expressions. Those methods can handle all the look behinds (negative and possitive) which I don't think ColdFusion can handle at all. That means that they can do much more than things like:
REFind()
REReplace()
So, it's speed, but it's also flexability.
Posted by Ben Nadel on Sep 30, 2006 at 11:16 AM
If (?i) and (?i:regex) works, (?-i) might also work, which with some regex libraries turns off case insensitivity for the remainder of the regular expression, e.g.: (?i)libby(?-i)[a-z]
Other things to test, which work with some libraries:
(?s) / (?-s) : Turn on/off dot matches newline.
(?m) / (?-m) : Turn on/off caret and dollar match after and before newlines.
If those work, you should also be able to do, e.g., (?i-sm) to turn on "i" and "m", but turn off "s" for the remainder of the regex.
Posted by Steve on Feb 2, 2007 at 4:09 PM
BTW, is there anything that needs to be done beyond what you show in your example code to make the Java methods available? Having extended regex functionality available to me in ColdFusion (particularly lookbehinds) has been a dream.
Posted by Steve on Feb 2, 2007 at 4:15 PM
Steve,
You know more about regular expressions than I do. I have not tried using (nor did I know about) flags that would turn off previous flags. As far as I know though, CFMX6/7 is running on top of Java 1.4.2 or something, so theoretically, anything that works in that edition of Java will run in ColdFusion (when using the underlying Java methods).
Try searching my site for ReplaceAll() and ReplaceFirst() which are the two main java RegEx string methods that I use:
http://www.bennadel.com/search/replaceall%20replacefirst
You also might want to search for Split(). Also another great Java String method:
http://www.bennadel.com/search/split(
Other than that, I am sure once you figure out the methods calls, you seem to know the nuts and bolts of the regex stuff better than I do, you will do great. You will also find that Java Regular expressions are NICE AND FAST.
Also, you might want to search for pattern / matcher:
http://www.bennadel.com/search/util.regex
Let me know if there is anything I can help with.
Posted by Ben Nadel on Feb 2, 2007 at 4:23 PM
Thanks for the leads, Ben!
Posted by Steve on Feb 3, 2007 at 12:40 AM
Trust me, once you go underlying Java string methods... you never go back.
Posted by Ben Nadel on Feb 3, 2007 at 9:17 AM