Author: sergeyken
Subject: Reasonable way of checking wildcards using REXX
Posted: Wed Sep 07, 2016 8:43 pm (GMT 5.5)
My post has been deleted from wrong forum by moderators.
Here is slightly updated copy FYI.
My version is using REXX as REXX, neither as COBOL, nor as C/C++, nor anything else.
For nails, a hammer is the best tool, while for screws a screwdriver is more suitable. For bolts the best tool is a wrench. Not vice versa; do not mix them!
_________________
Tyrannosaurus-REXX
Subject: Reasonable way of checking wildcards using REXX
Posted: Wed Sep 07, 2016 8:43 pm (GMT 5.5)
My post has been deleted from wrong forum by moderators.
Here is slightly updated copy FYI.
My version is using REXX as REXX, neither as COBOL, nor as C/C++, nor anything else.
For nails, a hammer is the best tool, while for screws a screwdriver is more suitable. For bolts the best tool is a wrench. Not vice versa; do not mix them!
Code: |
/* REXX */ Test: Wild = 'A?C*3' Str = 'ABC123' Say "$WildStr( '"Str"', '"Wild"' ) ==>" $WildStr( Str, Wild ) Wild = 'A?C*3??5*' Str = 'ABC---3xx5yyyyy' Say "$WildStr( '"Str"', '"Wild"' ) ==>" $WildStr( Str, Wild ) Wild = '*A?C*3??5*' Str = 'zzzzzzABC---3xx5yyyyy' Say "$WildStr( '"Str"', '"Wild"' ) ==>" $WildStr( Str, Wild ) Wild = 'A?C*3??5*' Str = 'ABC---3xxxx5yyyyy' Say "$WildStr( '"Str"', '"Wild"' ) ==>" $WildStr( Str, Wild ) return /**********************************************************************/ $WildStr: /* verify String against complex StrMask */ procedure /* Call: If $WildStr( MemberName, '*AB*C???0*1*' ) Then ... If $WildStr( MemberName, '*AB*C%%%0*1*', , '%' ) Then ... If $WildStr( MemberName, '*AB~C???0~1~', '~' ) Then ... */ Parse Arg String, StrMask, StrChar, WildChar If StrChar = '' Then StrChar = '*' Else StrChar = Left( StrChar, 1 ) If WildChar = '' Then WildChar = '?' Else WildChar = Left( WildChar, 1 ) Do While StrMask > '' Parse var StrMask, /* split by the first '*' */ PreWild (StrChar) StrMask If PreWild > '' Then Do /* check left from '*' as simple wildcard */ LeftStr = Left( String, Length(PreWild) ) /* same size fragment */ If ¬ $WildEq( LeftStr, PreWild, WildChar ) Then Return 0 End If StrMask = '' Then /* whole string verified successfully */ Return 1 /* try to match the '*' found as next part */ Do i = (Length(PreWild) + 1) To Length(String) /* skip left characters one by one; verify the rest recursively */ RestStr = Substr( String, i ) If $WildStr( RestStr, StrMask, StrChar, WildChar ) Then Return 1 End i End Return 0 /**********************************************************************/ $WildEQ: /* verify String against simple WildMask */ procedure /* Call: If $WildEQ( MemberName, 'ABC???01' ) Then ... If $WildEQ( MemberName, 'ABC%%%01', '%' ) Then ... */ Parse Arg String, WildMask, WildChar If WildChar = '' Then WildChar = '?' Else WildChar = Left( WildChar, 1 ) LowMask = Translate( WildMask, '00'x, WildChar ) HiMask = Translate( WildMask, 'FF'x, WildChar ) LowString = BitOr( LowMask, String, ' ' ) HiString = BitAnd( HiMask, String, ' ' ) Return (LowString == HiString) /**********************************************************************/ |
_________________
Tyrannosaurus-REXX