Regular Expression On-The-Fly Testing For ColdFusion, Java, And JavaScript
Often times, when answering Regular Expression questions on CF-Talk or in emails, I don't want to go through the bother of creating a ColdFusion page to test the expressions. I would jump into something like The RegEx Coach, but that only does Perl style regular expressions (I think). To remedy this, I have thrown together a page that will take a regular expression and try running it in ColdFusion, Java, and Javascript.
Take a look:
http://www.bennadel.com/resources/demo/regular_expression_replace/
I am eventually going to put it into bennadel.com/util/ when I get a few minutes. It is not perfect yet, but it does a pretty good job I think. It translates the regular expressions for use in ColdFusion and Java/Javascript in terms of group references. It performs all the replace calls within individual TRY / CATCH blocks so you can see any error messages that were thrown for each attempt.
If you are interested in the code that is performing this page:
<!--- Kill extra output. --->
<cfsilent>
<!--- Set page settings. --->
<cfsetting
showdebugoutput="false"
/>
<!--- Param form variables. --->
<cfparam
name="FORM.target_text"
type="string"
default="You have some sexy legs."
/>
<cfparam
name="FORM.regex"
type="string"
default="(sexy)(?= legs)"
/>
<cfparam
name="FORM.regex_replace"
type="string"
default="very $1"
/>
<!--- Set default result values. --->
<cfset REQUEST.CFResult = "" />
<cfset REQUEST.JavaResult = "" />
<cfset REQUEST.CFRegex = "" />
<cfset REQUEST.CFRegexReplace = "" />
<cfset REQUEST.JavaRegex = "" />
<cfset REQUEST.JavaRegexReplace = "" />
<!--- Try to run the ColdFusion regex replace. --->
<cftry>
<!--- Try to clean the for CF. --->
<cfset REQUEST.CFRegex = ToString( FORM.regex ).ReplaceAll( "(?<!\\)\$([\d]+)", "\\$1" ) />
<cfset REQUEST.CFRegexReplace = ToString( FORM.regex_replace ).ReplaceAll( "(?<!\\)\$([\d]+)", "\\$1" ) />
<!--- Run the replace. --->
<cfset REQUEST.CFResult = REReplace( FORM.target_text, REQUEST.CFRegex, REQUEST.CFRegexReplace, "ALL" ) />
<!--- Catch any errors. --->
<cfcatch>
<cfset REQUEST.CFResult = CFCATCH.Message />
</cfcatch>
</cftry>
<!--- Try to run the Java regex replace. --->
<cftry>
<!--- Try to clean the for Java. --->
<cfset REQUEST.JavaRegex = ToString( FORM.regex ).ReplaceAll( "(?<!\\)\$([\d]+)", "\\$1" ) />
<cfset REQUEST.JavaRegexReplace = ToString( FORM.regex_replace ).ReplaceAll( "(?<!\\)\\([\d]+)", "\$$1" ) />
<!--- Run the replace. --->
<cfset REQUEST.JavaResult = ToString( FORM.target_text ).ReplaceAll( REQUEST.JavaRegex, REQUEST.JavaRegexReplace ) />
<!--- Catch any errors. --->
<cfcatch>
<cfset REQUEST.JavaResult = CFCATCH.Message />
</cfcatch>
</cftry>
</cfsilent>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Regular Expression Testing @ Kinky Solutions by Ben Nadel</title>
<!-- Styles. -->
<style type="text/css">
body { background-image: url( "http://www.bennadel.com/images/global/background_logo.jpg" ) ; background-position: top right ; background-repeat: no-repeat ; margin: 20px 20px 20px 20px ; }
body, td { font: 11px verdana ; }
h2 { color: #FA3E0A ; font: 25px verdana ; margin: 0px 90px 15px 0px ; }
h3 { color: #FA3E0A ; font: 16px verdana ; margin: 0px 0px 15px 0px ; }
h4 { color: #333333 ; font: bold 13px verdana ; margin: 0px 0px 5px 0px ; }
p, ul, ol, table { line-height: 18px ; margin: 0px 90px 12px 0px ; }
a, a.red { color: #FA3E0A ; }
form { margin: 0px 0px 0px 0px ; }
input, select, textarea { font: 11px verdana ; vertical-align: middle ; }
input, textarea { padding: 2px 2px 2px 2px ; }
input.button { line-height: 11px ; }
div.code, div.codefixed { border: 1px solid #999999 ; margin-bottom: 18px ; padding: 2px 2px 2px 2px ; overflow: auto ; width: 95% ; }
div.codefixed { height: 200px ; }
div.code ul, div.codefixed ul { font-family: monospace, verdana ; font-size: 11px ; list-style-type: none ; margin: 0px 0px 0px 0px ; padding-left: 0px ; }
div.codefixed ul { width: 1200px ; }
div.code ul li, div.codefixed ul li { background-color: #F5F5F5 ; margin-bottom: 1px ; padding: 1px 3px 1px 3px ; }
div.code ul li.tab1, div.codefixed ul li.tab1 { padding-left: 30px ; }
div.code ul li.tab2, div.codefixed ul li.tab2 { padding-left: 60px ; }
div.code ul li.tab3, div.codefixed ul li.tab3 { padding-left: 90px ; }
div.code ul li.tab4, div.codefixed ul li.tab4 { padding-left: 120px ; }
div.code ul li.tab5, div.codefixed ul li.tab5 { padding-left: 150px ; }
div.code ul li.tab6, div.codefixed ul li.tab6 { padding-left: 180px ; }
div.code ul li.tab7, div.codefixed ul li.tab7 { padding-left: 210px ; }
div.code ul li.tab8, div.codefixed ul li.tab8 { padding-left: 240px ; }
div.code ul li.tab9, div.codefixed ul li.tab9 { padding-left: 270px ; }
#pagefooter { color: #666666 ; font-size: 10px ; font-style: italic ; margin: 30px 0px 0px 0px ; }
#pagefooter a { color: #666666 ; text-decoration: none ; }
#pagefooter a:hover { color: #FA3E0A ; text-decoration: underline ; }
form {
padding-top: 20px ;
}
textarea.input {
height: 100px ;
width: 300px ;
}
textarea.output {
height: 70px ;
width: 300px ;
}
button.process {
font-size: 16px ;
margin: 0px 15px 0px 15px ;
padding-bottom: 10px ;
padding-top: 10px ;
width: 120px ;
}
p.output {
margin-bottom: 0px ;
}
p.translated {
margin-bottom: 17px ;
}
span.translatedfrom {
background-color: #ffCC66 ;
}
span.translatedto {
background-color: #FCCCCC ;
}
td p {
margin-right: 0px ;
}
</style>
</head>
<body>
<cfoutput>
<h2>
Regular Expression Testing
</h2>
<p>
Enter your target text and regular expression for a text REPLACE.
See how this works in ColdFusion, Java, and Javascript. The regular
expression will automatically be translated to use "\" or "$"
depending on the language.
</p>
<form action="#CGI.script_name#" method="post">
<table cellspacing="0" cellpadding="0" border="0">
<tr valign="top">
<td>
<h4>
Target Text:
</h4>
<p>
<textarea name="target_text" class="input">#FORM.target_text#</textarea>
</p>
<h4>
Regular Expression:
</h4>
<p>
<textarea name="regex" class="input">#FORM.regex#</textarea>
</p>
<h4>
Regular Expression Replace:
</h4>
<textarea name="regex_replace" class="input">#FORM.regex_replace#</textarea>
</td>
<td valign="middle">
<button class="process">
Process<br />
Regular<br />
Expression
</button>
</td>
<td>
<h4>
ColdFusion Result - REReplace():
</h4>
<p class="output">
<textarea name="cf_result" class="output">#REQUEST.CFResult#</textarea>
</p>
<p class="translated">
Translated for CF: <br />
<span class="translatedfrom"
onclick="prompt( 'RegEx:', this.innerHTML );"
>#HtmlEditFormat( REQUEST.CFRegex )#</span>
»
<span class="translatedto"
onclick="prompt( 'RegEx:', this.innerHTML );"
>#HtmlEditFormat( REQUEST.CFRegexReplace )#</span>
</p>
<h4>
Java Result - ToString().ReplaceAll():
</h4>
<p class="output">
<textarea name="java_result" class="output">#REQUEST.JavaResult#</textarea>
</p>
<p class="translated">
Translated for Java:<br />
<span class="translatedfrom"
onclick="prompt( 'RegEx:', this.innerHTML );"
>#HtmlEditFormat( REQUEST.JavaRegex )#</span>
»
<span class="translatedto"
onclick="prompt( 'RegEx:', this.innerHTML );"
>#HtmlEditFormat( REQUEST.JavaRegexReplace )#</span>
</p>
<h4>
JavaScript Result - replace():
</h4>
<p class="output">
<textarea name="javascript_result" class="output"></textarea>
</p>
<p class="translated">
Translated for JavaScript: <br />
<span class="translatedfrom"
onclick="prompt( 'RegEx:', this.innerHTML );"
>#HtmlEditFormat( REQUEST.JavaRegex )#</span>
»
<span class="translatedto"
onclick="prompt( 'RegEx:', this.innerHTML );"
>#HtmlEditFormat( REQUEST.JavaRegexReplace )#</span>
</p>
<script type="text/javascript">
var objForm = document.forms[ 0 ];
var objJSResult = objForm.elements[ "javascript_result" ];
try {
objJSResult.value = objForm.elements[ "target_text" ].value.replace(
new RegExp(
"#JSStringFormat( REQUEST.JavaRegex )#",
"g"
),
"#JSStringFormat( REQUEST.JavaRegexReplace )#"
);
} catch( objError ){
objJSResult.value = objError.message;
}
</script>
</td>
</tr>
</table>
</form>
<p id="pagefooter">
Copyright Ben Nadel @ <a href="http://www.bennadel.com" target="_blank">Kinky Solutions</a><br />
Updated on March 20, 2007
</p>
</cfoutput>
</body>
</html>
Want to use code from this post? Check out the license.
Reader Comments
Very cool!!!!
Thanks dude. I got so tired of finding my test.cfm page :)
Another CF RegEx utility also exists at http://www.cftopper.com/contentfiles/tools/regularExpTester.cfm
It works quite well, also. Like Ben, I typically use other tools for most of my quick regex tests (RegexTester for Eclipse). If I need something more CF-centric, though, I've used the tool above.
It's nice to have options.
That one is much prettier than mine :)
Maybe, but it ain't the bees knees, either. :-) This is why most of us code monkeys first and designers second. Or last...
I'm not sure how to add links, here, but this is an amusing code monkey reset: http://www.youtube.com/watch?v=v4Wy7gRGgeA
Holy crap that was the coolest video / song ever!
I thought so, too. A buddy of mine sent it too me. I think it was the "boring manager Rob" part he liked so much. :-) It makes me laugh every time I watch it.
Very nice (the regex tester that is, though the video is awesome too). I hope you have a timeout set for that page though!
Perfect; exactly what I was looking for! Search engines get it right sometimes :)
I swear Ben... you keep coming up #2 in Google every damned time I search for something! I place bets with myself when I hit the enter key to see where you'll show up in the search results.
I'm interested in how you're converting from ColdFusion to Javascript regexps and back - is there some easy way to convert between the two syntaxes?
@Brian,
Ha ha, glad to amuse you with my indexing :)
As far as switching from Javascript to ColdFusion regular expression, there is really not much logic to it at all. The only difference is the back-reference: ColdFusion uses "\" where as Java and Javascript use "$". Other than that, I just wrap it in a TRY/CATCH as the support is different for regular expressions.
Guys, hi. Maybe this is not appropriate place to ask, but can anybody tell me Regex for all tags except four: <tr><td></td></tr>. I need to leave only this tags in the text and delete all others.
@Kirill,
The regex can be simple or more complex depending on how clean your code is. Here is a basic pattern for what you are looking for:
</?(?!(tr|td|/))[^\s>]+[^>]*>
If you have tags with attributes that *might* have the ">" character within it, then things get more complex and you have to take into account quoted attributes.
I have a string from database which returns me differents html tags including textarea tag. I only want to remove the textarea.
Can anyone help me plz.
Thanks