Ben Nadel
On User Experience (UX) Design, JavaScript, ColdFusion, Node.js, Life, and Love.
I am the chief technical officer at InVision App, Inc - a prototyping and collaboration platform for designers, built by designers. I also rock out in JavaScript and ColdFusion 24x7.
Meanwhile on Twitter
Loading latest tweet...
Ben Nadel at Scotch On The Rock (SOTR) 2010 (London) with:

Regular Expression On-The-Fly Testing For ColdFusion, Java, And JavaScript

By Ben Nadel on

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>
  • &nbsp;&raquo;&nbsp;
  • <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>
  • &nbsp;&raquo;&nbsp;
  • <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>
  • &nbsp;&raquo;&nbsp;
  • <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>


Reader Comments

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.

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