SlideShare a Scribd company logo
The Road to Damascus – A Conversion 
Experience: 
LS and @Formula to SSJS 
Matthew Fyleman, Product and Project Manager 
MWLUG 2014
Who am I? 
• Matthew Fyleman 
• 21 Years as a Notes/Domino Developer 
• Mostly Working on: 
– Xpages conversions 
– Product development
What is this Talk About? 
• Based on My Experiences 
• Converting LotusScript and @Formula 
to SSJS 
• Tools that can help – particularly 
regular expressions
What am I talking about? 
• When should you convert existing code? 
• Conversion Options 
– NotesAgent.run() with parameter doc 
– Search and Replace 
– Dedicated Tools 
• Search and Replace 
– Preparation 
– Introduction to Regular Expressions 
– Examples and Demonstration 
– Tips and Traps 
• Dedicated Tools 
• Questions
When should you convert code? 
Never!
When should you convert code? 
What is the problem? 
• It is always going to be slow 
• GIGO 
• You will introduce new bugs 
• Re-developing will be quicker, cheaper 
and you will end up with a better result 
• But if you really must ...
Conversion Options 
What are your options? 
• NotesAgent.run() 
– Quick and Dirty 
– Agent must run independently 
– Only use when agents are available and time is critical 
• Search and Replace 
– LotusScript -> JavaScript (and Java) 
– Less useful for @Formula 
• Dedicated Tools 
– @Formula
LotusScript to SSJS - Preparation 
• Search and Replace is most useful for LS conversion 
– Syntactically similar 
• Easiest if you do a little refactoring first 
– Option Declare 
– doc.field(0) -> doc.getItemValue(“Field“)(0) 
– Camel Case Notes Objects 
– Make Sure Method calls are consistently named 
• Best to Avoid All-In-One-Go 
– Function or Sub at a Time
Regular Expressions 
• Regular Expressions are your new BFF 
• Sophisticated Pattern Matching 
• Elements from search can be carried through to 
replace 
• The Search and Replace built in to DDE can use 
Regular Expressions 
• Useful outside LS conversion (e.g. Validation) 
– See Planet Lotus - http://planetlotus.org/profiles/ross-swick_97733
Starting Simple – Dim 
• Tidy up first – Option Declare, remove clustering e.g.: 
Dim x as Integer,y as Integer,z as Integer 
• We want to match any variable name in the pattern: 
Dim <var name> As <Any valid type> 
• Fairly simple: 
Dim[ ]+[A-Za-z0-9_]+[ ]+As[ ]+(Integer|String|Boolean|Double|Variant) 
• But how do we replace? 
– Modify the search: 
Dim[ ]+([w]*)[ ]+As[ ]+String 
– Use this for replace 
var 1 = “”;
Starting Simple – Dim (2) 
• For Notes Objects, Things are simpler 
Dim <var name> As Notes<rest of object name> 
- Ignore ... As New NotesSession for now 
• Also, initialising in SSJS, = null is ok: 
var <var name>:Notes<rest of object name> = null; 
• So our terms are: 
– Search: 
Dim[ ]+([w]*)[ ]+As[ ]+(Notes[w]*) 
– Replace: 
var 1:2 = null;
Less simple – If Statements 
• For the most part, simple S & R (but order is important): 
End If to } 
[ ]*Then to ) { 
Else[ ]+If[ ]* to } else if ( 
If[ ]* to if ( 
• But what about: 
If (x = 10) Then 
• Use Search: If[ ]+([w()[].<>" ]*)=([w()[].<> "]*)[ ]+Then 
• Use Replace: if (1==2) { 
• NB: Works but not optimal! 
• Other comparison operators not a problem
! – session objects 
• The problem: 
• Session object is global in ssjs: ‘session’ 
• In LS it is created: 
Dim sess As New NotesSession 
• Need to find all LS session objects, and replace with session 
• How do you get a list of session object names? 
You need a coffee!
Adding Java 
• Java String Object has regex search and replace 
String source = “Dim x As String”; 
String result = source.replaceAll(“Dim[ ]+([w]*)[ ]+As[ ]+String”, “var $1 = “”;”); 
• Pattern and Matcher objects make this even more powerful 
Pattern p = Pattern.compile(pattern); 
Matcher m = p.matcher(this.source); 
int startPos = 0; 
while (m.find(startPos)) { 
if (!itemList.contains(m.group(1))) { 
itemList.add(m.group(1)); 
} 
startPos = m.end() + 1; 
}
Field Handling 
• Similar Issue to Session 
• Need to find all document object names, and replace field 
handling methods 
• Will probably need to handle dot notation 
– Arrgghh! 
• How do you search for dot notation? 
<doc name>.([^GetItemValue])([0-9]+) 
• Still hard work!
Search and Replace: Tips & Traps 
• There are other types than string! 
– Always review and test converted code thoroughly 
• Date handling is a pain 
– Script libraries can help here – Java? 
• Watch out for User interaction and particularly dialogues 
Work out your strategies in advance!
Converting Formula 
• @Formula JavaScript Wrappers help a lot 
– Mostly just ‘;’ to ‘,’, and converting lists to arrays 
• Some constructions are obvious: 
@SetField(“Field”, Value); 
• Goes to: 
doc.replaceItemValue(“Field”, Value); 
• Or 
S: @SetField([ ]*([w”]*)[ ]*,[ ]*([w”]*)[ ]*); 
R: doc.replaceItemValue(1, 2); 
• But there are some issues ... 
@
Formula – List Processing 
• No direct equivalent in SSJS for *+, *= *>= etc. 
when applied to Lists 
• Need to plan for this 
• Java Class/Library to provide direct substitute 
• Unfortunately, Java does not permit operator 
overloading, so has to be a set of methods 
@!
Formula - @If, @Do and @While 
@If(@Contains(_WFData_neu;_Key);""; 
@Do( 
@Set("_Sachgebiet_Zuordnung";@DbLookup("NOTES":"NOCACHE";"":_ADM$StructureDB;"Workflows";"WFArbeitsanweisung";"Sachgebietzuordnung")); 
@If(_Sachgebiet_Zuordnung = "" | !@Contains(_Sachgebiet_Zuordnung;_Key2);@Do( 
@Prompt([Ok];"Hinweis";"In der System Struktur VBM wurde für das aktuelle Sachgebiet kein Workflow definiert. Das Dokument wird zum ehemaligen 
Kompetenzträger zurückgegeben, damit dieser ein neues Sachgebiet auswählen kann."); 
@Set("_Kompetenzträger";Bearbeiter1); 
@Set("_tmpintern";5) 
); 
@Do( 
@Prompt([Ok];"Hinweis";"In der System Struktur VBM wurde für das aktuelle Sachgebiet ein neues Sachgebiet konfiguriert. Das Dokument wird zum 
Kompetenzträger zurückgegeben, damit dieser das neue Sachgebiet auswählen kann."); 
@Set("_neues_Sachgebiet";@Left(@Right(_Sachgebiet_Zuordnung;_key2);"||")); 
@Set("_Elements";@Elements(@Explode(@Left(@Left(@Right(_WFData_neu;"||Sachgebiet#");"||"); _neues_Sachgebiet) + _neues_Sachgebiet; "$" ))); 
@Set("_KompetenzträgerData";@Explode(@Left(@Right(_WFData_neu;"||Kompetenzträger#");"||"); "$")); 
@Set("_Kompetenzträger";@Subset(@Subset(_KompetenzträgerData;_Elements);-1)); 
@Set("_tmpintern";6) 
) 
) 
) 
); @!!
Focusing on @If 
• @Formula is a FUNCTION language 
• @If is a function not a statement 
@!!! • In practice: 
@SetField(“Author”; @If(Status=“1”; Manager; Salesman)); 
• Needs to convert to: 
if (Status == “1”) { 
var author = doc.getItemValueString(“Manager”); 
} else { 
var author = doc.getItemValueString(“Salesman”); 
} 
doc.replaceItemValue(“Author”, author);
Tools 
• Search and Replace can be used for @Formula -> 
SSJS ... 
• ... but it can only take you so far 
• A dedicated tool can go further 
– Only real alternative to manual translation for complex 
statements 
– Time consuming to create 
– Still not a silver bullet
Third Party Tools 
• Espresso - http://www.ultrapico.com/Expresso.htm 
– Good for learning regex, and serious regex dev 
– Free! 
• GREP 
– Sophisticated regex file search 
– Where regex started (UNIX grep)!
Resources and Information 
• We4IT – www.we4it.com 
• OpenNTF – www.openntf.org 
• Regex Quick Reference 
http://www.night-ray.com/regex.pdf 
• Loads of websites for all aspects of regex development 
• Mastering Regular Expressions – Jeffrey E.F. Friedl – 
O’Reilly Publishing
Questions?
matthew.fyleman@we4it.com

More Related Content

PDF
Icsug dev day2014_road to damascus - conversion experience-lotusscript and @f...
PDF
bccon-2014 dev03 xpages-road_to_damascas-lotus-script-and-@formula-to-ssjs
PPT
Json - ideal for data interchange
PPT
Pxb For Yapc2008
PDF
functional groovy
PDF
nGram full text search (by 이성욱)
PPT
Sax Dom Tutorial
PDF
awesome groovy
Icsug dev day2014_road to damascus - conversion experience-lotusscript and @f...
bccon-2014 dev03 xpages-road_to_damascas-lotus-script-and-@formula-to-ssjs
Json - ideal for data interchange
Pxb For Yapc2008
functional groovy
nGram full text search (by 이성욱)
Sax Dom Tutorial
awesome groovy

What's hot (20)

PDF
Search Engine-Building with Lucene and Solr
PPT
Introduction To Groovy
ODP
What's new, what's hot in PHP 5.3
PPTX
Namespace in C++ Programming Language
ODP
Functional programming with Scala
PDF
groovy rules
PPT
Java XML Parsing
PPT
Building Data Mapper PHP5
PPTX
Linq Introduction
PPTX
Tutorial on developing a Solr search component plugin
PDF
Designing and Building a Graph Database Application – Architectural Choices, ...
PPTX
SFDC Introduction to Apex
PDF
Querydsl overview 2014
PPT
Prototype Js
PPTX
The JavaScript Programming Language
PDF
Querydsl fin jug - june 2012
PPTX
Java 103 intro to java data structures
PDF
Advanced Relevancy Ranking
PPS
MongoDB crud
PDF
Query Parsing - Tips and Tricks
Search Engine-Building with Lucene and Solr
Introduction To Groovy
What's new, what's hot in PHP 5.3
Namespace in C++ Programming Language
Functional programming with Scala
groovy rules
Java XML Parsing
Building Data Mapper PHP5
Linq Introduction
Tutorial on developing a Solr search component plugin
Designing and Building a Graph Database Application – Architectural Choices, ...
SFDC Introduction to Apex
Querydsl overview 2014
Prototype Js
The JavaScript Programming Language
Querydsl fin jug - june 2012
Java 103 intro to java data structures
Advanced Relevancy Ranking
MongoDB crud
Query Parsing - Tips and Tricks
Ad

Viewers also liked (20)

PPTX
Interruptores
PDF
Iisrt settu ravichandran (civil)
PDF
Iisrt zzz satyabrata khatua
PDF
Iisrt aarthi ravindran (networks)
PDF
Iisrt zzz bhavyasri vanteddu
PPTX
Antena Kaleng (raihan s & syis f)
PDF
Vembu SaaSBackup – Backup Solution for Office 365 and Google Apps !
PDF
Questões -rotinas_administrativas_alunos
PPT
Sistema de gestion en seguridad y salud leere urgente
PPTX
Persentasi Jaringan WAN (Raihan & Badi)
PPTX
foreveryoungasia
DOCX
asdfghjkl
PPTX
preciptation profiles on sprinkler irrigation
PDF
Iisrt sibi kumar (mech)
PDF
Kids Collection In Chennai
PDF
Iisrt karthik subramanian
PDF
Termes de référence du forum national d’échanges et de validation du contrat ...
PPTX
Map Edit Records to Forms
PDF
Communication sur l’étude « Analyse de la problématique de la mise en applica...
Interruptores
Iisrt settu ravichandran (civil)
Iisrt zzz satyabrata khatua
Iisrt aarthi ravindran (networks)
Iisrt zzz bhavyasri vanteddu
Antena Kaleng (raihan s & syis f)
Vembu SaaSBackup – Backup Solution for Office 365 and Google Apps !
Questões -rotinas_administrativas_alunos
Sistema de gestion en seguridad y salud leere urgente
Persentasi Jaringan WAN (Raihan & Badi)
foreveryoungasia
asdfghjkl
preciptation profiles on sprinkler irrigation
Iisrt sibi kumar (mech)
Kids Collection In Chennai
Iisrt karthik subramanian
Termes de référence du forum national d’échanges et de validation du contrat ...
Map Edit Records to Forms
Communication sur l’étude « Analyse de la problématique de la mise en applica...
Ad

Similar to The Road To Damascus - A Conversion Experience: LotusScript and @Formula to SSJS (20)

PDF
Icsug conf 14_dev03_xpages-roadtodamascas-lotus-script-and-formula-to-ssjs
PDF
Modern, Scalable, Ambitious apps with Ember.js
PPT
Presentation JavaScript Introduction Data Types Variables Control Structure
PDF
Java Script
PPT
Java Script
PPT
JavaScript ppt for introduction of javascripta
PPTX
Introduction To Programming In R for data analyst
PPT
javaScript.ppt
PDF
JSLT: JSON querying and transformation
PDF
DIG1108C Lesson3 Fall 2014
PPTX
Дмитрий Нестерук, Паттерны проектирования в XXI веке
PPTX
Code for Startup MVP (Ruby on Rails) Session 2
PPTX
How I Learned to Stop Worrying and Love Legacy Code - Ox:Agile 2018
PPTX
A brief tour of modern Java
PPTX
Android webinar class_java_review
PDF
Design Patterns in Modern C++
PPTX
PostgreSQL - It's kind've a nifty database
PDF
Rich Internet Applications con JavaFX e NetBeans
PPTX
PLSQL-OO [SOUG 2022].pptx
KEY
Scaling php applications with redis
Icsug conf 14_dev03_xpages-roadtodamascas-lotus-script-and-formula-to-ssjs
Modern, Scalable, Ambitious apps with Ember.js
Presentation JavaScript Introduction Data Types Variables Control Structure
Java Script
Java Script
JavaScript ppt for introduction of javascripta
Introduction To Programming In R for data analyst
javaScript.ppt
JSLT: JSON querying and transformation
DIG1108C Lesson3 Fall 2014
Дмитрий Нестерук, Паттерны проектирования в XXI веке
Code for Startup MVP (Ruby on Rails) Session 2
How I Learned to Stop Worrying and Love Legacy Code - Ox:Agile 2018
A brief tour of modern Java
Android webinar class_java_review
Design Patterns in Modern C++
PostgreSQL - It's kind've a nifty database
Rich Internet Applications con JavaFX e NetBeans
PLSQL-OO [SOUG 2022].pptx
Scaling php applications with redis

Recently uploaded (20)

PDF
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
PDF
Digital Strategies for Manufacturing Companies
PDF
How to Migrate SBCGlobal Email to Yahoo Easily
PDF
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
PDF
Design an Analysis of Algorithms I-SECS-1021-03
PDF
top salesforce developer skills in 2025.pdf
PDF
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
PDF
wealthsignaloriginal-com-DS-text-... (1).pdf
PPTX
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
PDF
AI in Product Development-omnex systems
PDF
How Creative Agencies Leverage Project Management Software.pdf
PPTX
history of c programming in notes for students .pptx
PPTX
Essential Infomation Tech presentation.pptx
PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PPTX
Reimagine Home Health with the Power of Agentic AI​
PDF
2025 Textile ERP Trends: SAP, Odoo & Oracle
PDF
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
PPTX
CHAPTER 2 - PM Management and IT Context
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
Digital Strategies for Manufacturing Companies
How to Migrate SBCGlobal Email to Yahoo Easily
Raksha Bandhan Grocery Pricing Trends in India 2025.pdf
Design an Analysis of Algorithms I-SECS-1021-03
top salesforce developer skills in 2025.pdf
Audit Checklist Design Aligning with ISO, IATF, and Industry Standards — Omne...
wealthsignaloriginal-com-DS-text-... (1).pdf
Agentic AI Use Case- Contract Lifecycle Management (CLM).pptx
AI in Product Development-omnex systems
How Creative Agencies Leverage Project Management Software.pdf
history of c programming in notes for students .pptx
Essential Infomation Tech presentation.pptx
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
Internet Downloader Manager (IDM) Crack 6.42 Build 41
Reimagine Home Health with the Power of Agentic AI​
2025 Textile ERP Trends: SAP, Odoo & Oracle
Addressing The Cult of Project Management Tools-Why Disconnected Work is Hold...
CHAPTER 2 - PM Management and IT Context
Adobe Illustrator 28.6 Crack My Vision of Vector Design

The Road To Damascus - A Conversion Experience: LotusScript and @Formula to SSJS

  • 1. The Road to Damascus – A Conversion Experience: LS and @Formula to SSJS Matthew Fyleman, Product and Project Manager MWLUG 2014
  • 2. Who am I? • Matthew Fyleman • 21 Years as a Notes/Domino Developer • Mostly Working on: – Xpages conversions – Product development
  • 3. What is this Talk About? • Based on My Experiences • Converting LotusScript and @Formula to SSJS • Tools that can help – particularly regular expressions
  • 4. What am I talking about? • When should you convert existing code? • Conversion Options – NotesAgent.run() with parameter doc – Search and Replace – Dedicated Tools • Search and Replace – Preparation – Introduction to Regular Expressions – Examples and Demonstration – Tips and Traps • Dedicated Tools • Questions
  • 5. When should you convert code? Never!
  • 6. When should you convert code? What is the problem? • It is always going to be slow • GIGO • You will introduce new bugs • Re-developing will be quicker, cheaper and you will end up with a better result • But if you really must ...
  • 7. Conversion Options What are your options? • NotesAgent.run() – Quick and Dirty – Agent must run independently – Only use when agents are available and time is critical • Search and Replace – LotusScript -> JavaScript (and Java) – Less useful for @Formula • Dedicated Tools – @Formula
  • 8. LotusScript to SSJS - Preparation • Search and Replace is most useful for LS conversion – Syntactically similar • Easiest if you do a little refactoring first – Option Declare – doc.field(0) -> doc.getItemValue(“Field“)(0) – Camel Case Notes Objects – Make Sure Method calls are consistently named • Best to Avoid All-In-One-Go – Function or Sub at a Time
  • 9. Regular Expressions • Regular Expressions are your new BFF • Sophisticated Pattern Matching • Elements from search can be carried through to replace • The Search and Replace built in to DDE can use Regular Expressions • Useful outside LS conversion (e.g. Validation) – See Planet Lotus - http://planetlotus.org/profiles/ross-swick_97733
  • 10. Starting Simple – Dim • Tidy up first – Option Declare, remove clustering e.g.: Dim x as Integer,y as Integer,z as Integer • We want to match any variable name in the pattern: Dim <var name> As <Any valid type> • Fairly simple: Dim[ ]+[A-Za-z0-9_]+[ ]+As[ ]+(Integer|String|Boolean|Double|Variant) • But how do we replace? – Modify the search: Dim[ ]+([w]*)[ ]+As[ ]+String – Use this for replace var 1 = “”;
  • 11. Starting Simple – Dim (2) • For Notes Objects, Things are simpler Dim <var name> As Notes<rest of object name> - Ignore ... As New NotesSession for now • Also, initialising in SSJS, = null is ok: var <var name>:Notes<rest of object name> = null; • So our terms are: – Search: Dim[ ]+([w]*)[ ]+As[ ]+(Notes[w]*) – Replace: var 1:2 = null;
  • 12. Less simple – If Statements • For the most part, simple S & R (but order is important): End If to } [ ]*Then to ) { Else[ ]+If[ ]* to } else if ( If[ ]* to if ( • But what about: If (x = 10) Then • Use Search: If[ ]+([w()[].<>" ]*)=([w()[].<> "]*)[ ]+Then • Use Replace: if (1==2) { • NB: Works but not optimal! • Other comparison operators not a problem
  • 13. ! – session objects • The problem: • Session object is global in ssjs: ‘session’ • In LS it is created: Dim sess As New NotesSession • Need to find all LS session objects, and replace with session • How do you get a list of session object names? You need a coffee!
  • 14. Adding Java • Java String Object has regex search and replace String source = “Dim x As String”; String result = source.replaceAll(“Dim[ ]+([w]*)[ ]+As[ ]+String”, “var $1 = “”;”); • Pattern and Matcher objects make this even more powerful Pattern p = Pattern.compile(pattern); Matcher m = p.matcher(this.source); int startPos = 0; while (m.find(startPos)) { if (!itemList.contains(m.group(1))) { itemList.add(m.group(1)); } startPos = m.end() + 1; }
  • 15. Field Handling • Similar Issue to Session • Need to find all document object names, and replace field handling methods • Will probably need to handle dot notation – Arrgghh! • How do you search for dot notation? <doc name>.([^GetItemValue])([0-9]+) • Still hard work!
  • 16. Search and Replace: Tips & Traps • There are other types than string! – Always review and test converted code thoroughly • Date handling is a pain – Script libraries can help here – Java? • Watch out for User interaction and particularly dialogues Work out your strategies in advance!
  • 17. Converting Formula • @Formula JavaScript Wrappers help a lot – Mostly just ‘;’ to ‘,’, and converting lists to arrays • Some constructions are obvious: @SetField(“Field”, Value); • Goes to: doc.replaceItemValue(“Field”, Value); • Or S: @SetField([ ]*([w”]*)[ ]*,[ ]*([w”]*)[ ]*); R: doc.replaceItemValue(1, 2); • But there are some issues ... @
  • 18. Formula – List Processing • No direct equivalent in SSJS for *+, *= *>= etc. when applied to Lists • Need to plan for this • Java Class/Library to provide direct substitute • Unfortunately, Java does not permit operator overloading, so has to be a set of methods @!
  • 19. Formula - @If, @Do and @While @If(@Contains(_WFData_neu;_Key);""; @Do( @Set("_Sachgebiet_Zuordnung";@DbLookup("NOTES":"NOCACHE";"":_ADM$StructureDB;"Workflows";"WFArbeitsanweisung";"Sachgebietzuordnung")); @If(_Sachgebiet_Zuordnung = "" | !@Contains(_Sachgebiet_Zuordnung;_Key2);@Do( @Prompt([Ok];"Hinweis";"In der System Struktur VBM wurde für das aktuelle Sachgebiet kein Workflow definiert. Das Dokument wird zum ehemaligen Kompetenzträger zurückgegeben, damit dieser ein neues Sachgebiet auswählen kann."); @Set("_Kompetenzträger";Bearbeiter1); @Set("_tmpintern";5) ); @Do( @Prompt([Ok];"Hinweis";"In der System Struktur VBM wurde für das aktuelle Sachgebiet ein neues Sachgebiet konfiguriert. Das Dokument wird zum Kompetenzträger zurückgegeben, damit dieser das neue Sachgebiet auswählen kann."); @Set("_neues_Sachgebiet";@Left(@Right(_Sachgebiet_Zuordnung;_key2);"||")); @Set("_Elements";@Elements(@Explode(@Left(@Left(@Right(_WFData_neu;"||Sachgebiet#");"||"); _neues_Sachgebiet) + _neues_Sachgebiet; "$" ))); @Set("_KompetenzträgerData";@Explode(@Left(@Right(_WFData_neu;"||Kompetenzträger#");"||"); "$")); @Set("_Kompetenzträger";@Subset(@Subset(_KompetenzträgerData;_Elements);-1)); @Set("_tmpintern";6) ) ) ) ); @!!
  • 20. Focusing on @If • @Formula is a FUNCTION language • @If is a function not a statement @!!! • In practice: @SetField(“Author”; @If(Status=“1”; Manager; Salesman)); • Needs to convert to: if (Status == “1”) { var author = doc.getItemValueString(“Manager”); } else { var author = doc.getItemValueString(“Salesman”); } doc.replaceItemValue(“Author”, author);
  • 21. Tools • Search and Replace can be used for @Formula -> SSJS ... • ... but it can only take you so far • A dedicated tool can go further – Only real alternative to manual translation for complex statements – Time consuming to create – Still not a silver bullet
  • 22. Third Party Tools • Espresso - http://www.ultrapico.com/Expresso.htm – Good for learning regex, and serious regex dev – Free! • GREP – Sophisticated regex file search – Where regex started (UNIX grep)!
  • 23. Resources and Information • We4IT – www.we4it.com • OpenNTF – www.openntf.org • Regex Quick Reference http://www.night-ray.com/regex.pdf • Loads of websites for all aspects of regex development • Mastering Regular Expressions – Jeffrey E.F. Friedl – O’Reilly Publishing