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 cf.Objective() 2011 (Minneapolis, MN) 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.

Reply to this Comment

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?

Reply to this Comment

@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.

Reply to this Comment

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.

Reply to this Comment

@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.

Reply to this Comment

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

Reply to this Comment

Post A Comment

You — Get Out Of My Dreams, Get Into My Comments
Live in the Now
Oops!
Comment Etiquette: Please do not post spam. Please keep the comments on-topic. Please do not post unrelated questions or large chunks of code. And, above all, please be nice to each other - we're trying to have a good conversation here.