Regular Expression Test Panel

This is a panel that evaluates an editable test string and an editable regular expression using the SplitString operation. The regular expression can be entered in either the PCRE pattern (useful if you're used to using regular expressions from other languages) or the Igor /E pattern (useful for copying and pasting back and forth into a string literal in a procedure file which will be converted to the PCRE version).

The conversion is primitive and only looks for doubled slashes ("\\") in the Igor version and single slashes in the interpreted version (I looked for a built in operation functions that could do this conversion, like when one enters text for an annotation and Igor builds a command with proper escape coding, but I couldn't find anything), but that should suffice for normal use. Apparently you can use the actual tab character in a regular expression to look for a tab character in a string, but I think the standard method is to use \t (which has to be entered as \\t in an Igor string literal in order to become \t in a PCRE in order to look for a tab character. As far as I know, it's only the need to double up slashes in Igor code string literals that causes the difference. Confusing? No doubt. That's why I wrote this snippet. It's also well explained in the Regular Expressions section of Programming.ihf

Note also that SetVariable controls don't convert escape strings: Entering \t in the PCRE field really does result in the slash and t characters being sent to the regular expression engine, not a tab character.


#pragma rtGlobals=1		// Use modern global access method.

Window Regexp_Panel() : Panel
	PauseUpdate; Silent 1		// building window...
	NewPanel /W=(50,66,634,411) as "Regular Expression Tester"
	SetVariable setvar_teststring,pos={1,2},size={447,16},proc=SetVarProc_RegexpTester,title="Test String"
	SetVariable setvar_teststring,value= _STR:"Thursday, May 7, 2009"
	SetVariable setvar_PCREpattern,pos={3,28},size={444,16},proc=SetVarProc_RegexpTester,title="PCRE pattern"
	SetVariable setvar_PCREpattern,value= _STR:"([[:alpha:]]+), ([[:alpha:]]+) ([[:digit:]]+), ([[:digit:]]+)"
	SetVariable setvar_sub0,pos={17,81},size={209,16},title="sub0"
	SetVariable setvar_sub0,value= _STR:"Thursday",noedit= 1
	SetVariable setvar_sub1,pos={19,103},size={208,16},title="sub1"
	SetVariable setvar_sub1,value= _STR:"May",noedit= 1
	SetVariable setvar_sub2,pos={20,125},size={198,16},title="sub2"
	SetVariable setvar_sub2,value= _STR:"7",noedit= 1
	SetVariable setvar_sub3,pos={21,150},size={191,16},title="sub3"
	SetVariable setvar_sub3,value= _STR:"2009",noedit= 1
	SetVariable setvar_sub4,pos={20,172},size={192,16},title="sub4"
	SetVariable setvar_sub4,value= _STR:"",noedit= 1
	SetVariable setvar_sub5,pos={22,196},size={190,16},title="sub5"
	SetVariable setvar_sub5,value= _STR:"",noedit= 1
	SetVariable setvar_S_value,pos={11,226},size={406,16},title="S_Value"
	SetVariable setvar_S_value,value= _STR:"Thursday, May 7, 2009",noedit= 1
	SetVariable setvar_V_Flag,pos={17,255},size={88,16},title="V_Flag"
	SetVariable setvar_V_Flag,value= _NUM:4,noedit= 1
	CheckBox check_error,pos={11,284},size={134,14},title="Regular Expression Error"
	CheckBox check_error,value= 0,side= 1
	SetVariable setvar_IgorCodePattern,pos={5,51},size={441,16},proc=SetVarProc_RegexpTester,title="Igor /E pattern"
	SetVariable setvar_IgorCodePattern,value= _STR:"([[:alpha:]]+), ([[:alpha:]]+) ([[:digit:]]+), ([[:digit:]]+)"
EndMacro

Function UpdateREPanel(panelname)
	string panelname
	ControlInfo /W=$panelname setvar_teststring
	string teststring = S_Value
	ControlInfo /W=$panelname setvar_PCREpattern
	string regexp = S_Value
	string sub0, sub1, sub2, sub3, sub4, sub5

	try
		SplitString /E=regexp teststring, sub0, sub1, sub2, sub3, sub4, sub5 ; AbortOnRTE
		CheckBox check_error win=$panelName, value = 0
	catch
		CheckBox check_error win=$panelName, value = 1
	endtry
	
	SetVariable setvar_sub0 win=$panelName, value = _STR:(sub0)
	SetVariable setvar_sub1 win=$panelName, value = _STR:(sub1)
	SetVariable setvar_sub2 win=$panelName, value = _STR:(sub2)
	SetVariable setvar_sub3 win=$panelName, value = _STR:(sub3)
	SetVariable setvar_sub4 win=$panelName, value = _STR:(sub4)
	SetVariable setvar_sub5 win=$panelName, value = _STR:(sub5)
	SetVariable setvar_S_Value win=$panelName, value = _STR:(S_Value)
	SetVariable setvar_V_Flag win=$panelName, value = _NUM:(V_Flag)
	
End

Function SetVarProc_RegexpTester(sva) : SetVariableControl
	STRUCT WMSetVariableAction &sva

	switch( sva.eventCode )
		case 1: // mouse up
		case 2: // Enter key
		case 3: // Live update
			strswitch(sva.ctrlName)
				case "setvar_PCREpattern":
					SetVariable setvar_IgorCodePattern win=$sva.win, value = _STR:(ReverseProcessIgorString(sva.sval))
					break
				case "setvar_IgorCodePattern":
					SetVariable setvar_PCREpattern win=$sva.win, value = _STR:(ProcessIgorString(sva.sval))
					break
				case "setvar_teststring":
//					print sva.sval
					break
			EndSwitch
					
			UpdateREPanel(sva.win)
			break
		case -1: // control being killed
			break
	endswitch

	return 0
End

Function /S ReverseProcessIgorString(stringin)
	string stringin
	string stringout = ReplaceString("\\",stringin,"\\\\")
	return stringout
End

Function /S ProcessIgorString(stringin)
	string stringin
	string stringout = ReplaceString("\\\\",stringin,"\\")
	return stringout
End

Forum

Support

Gallery

Igor Pro 10

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More