Mark A Matte
markamatte at hotmail.com
Sun Apr 20 16:04:15 CDT 2008
Mike, Thanks very much. I'm not familiar with "regular expressions"...but curious. I will be out of town for a week...but will implement next week. Thanks again, Mark A. Matte > Date: Sat, 19 Apr 2008 18:48:44 -0400 > From: jedi at charm.net > To: accessd at databaseadvisors.com > Subject: Re: [AccessD] Search for credit card numbers > > Hi Mark, here is an improved function to capture cc numbers within a > string. The other one I sent you only worked 2/3, the contiguous part > failed by not capturing enough. However this version fixes that. I have > included instructions within the function so please follow them. Also keep > this function handy somewhere and use it as a template for future regular > expressions. > > Explanation: > This function only demonstrates the power of regular expressions and > includes a built-in test string. All you need to do is copy it and paste > into a module and run it. > > I modified the test pattern to > ccpattern = "(\d{3,5}((\ |-|\.)\d{3,5})+|\d{13,16})" > and is in 2 parts. > > Part 1, \d{4,6}((\ |-|\.)\d{4,6})+ includes some enhancements. The \d{4,6} > means that I am looking for either 4,5,6 digits-no more, no less. I > removed the ? from the (\ |-|\.) because now I want to implicitly look for > groups of > ((\ |-|\.)\d{4,6})+ like .12345. So now I will capture numbers like > 1234-567899-90001 and 1234 0001.1000-9999 and so on. Btw, you always > modify the > (\ |-|\.) to suit your needs adding more simply by inserting a | between > each char. Notice that some chars have a \ in front-that just means to use > the literal char as some of these chars have special meanings. > > Part 2, |\d{13,16} is new in that this is an OR condition that uses the "|" > pipe or vertical bar as the OR part. So now I am implicitly looking for > 13,14,15,16 contiguous digits. > > When you ready to implement this into your project copy the guts into your > code. > > Enjoy, Mike... > > > ' > ' set a debug breakpoint at the regex.test(str) and > ' step 1 line at time > ' > ' in the debug window add watches for the following: > ' matches > ' matches(0).submatches > ' matches(1).submatches > ' matches(2).submatches > ' matches(3).submatches > ' matches(4).submatches > ' ccnumber > ' > ' these will contain the cc number if matched > ' > Function ccMatch() As Boolean > Dim regex As Object > Dim ccpattern As Variant > Dim regexMatch As Boolean > Dim str As String > Dim matches As Variant > > str = "The quick brown fox with cc numbers 1234 0001.1000-9999, > 1234-567899-90001, 123.100000-99999, 1234567890123, and 0000999910009999 > jumped over the fence" > > ccMatch = 0 > ccpattern = "(\d{4,6}((\ |-|\.)\d{4,6})+|\d{13,16})" > ' ccpattern = "(\d+((\ |-|\.)?\d+)+)" > > Set regex = CreateObject("VBScript.RegExp") > ' global is needed for multiple matches otherwise > ' will stop after first match > regex.Global = True > ' regexMatch = True > ' regex.ignorecase = True > > ' test for cc number > regex.pattern = ccpattern > regexMatch = regex.test(str) > Set matches = regex.Execute(str) > > ' stop stepping here and look at the results > If (regexMatch) Then > ' got a match > > ' the matches collection show how many matches there are in the > string > ' the submatches index is the parenthesis order starting > ' from left to right, in debug these are shown as item 1, item 2, etc > ' and tell you how to numerate the collection starting with 0 > > ' iterate through collection > For Each thisitem In matches > ccnumber = thisitem > ' now you can use your best method for replacing the cc number > ' with your string > ' regex.replace > Next > > ccMatch = 1 > End If > End Function > > > > > *********** REPLY SEPARATOR *********** > > On 4/18/2008 at 8:41 PM Michael Bahr wrote: > >>Ok here is a function that may work for you. I have not tested it. I >>leave the replace part to you. Use the debugger amply. >> >>' This will match the following cc numbers: >>'0000-0000-0000-0000 >>'0000 0000 0000 0000 >>'0000000000000000 >> >>' >>' set a debug breakpoint at the top of this function and >>' step 1 line at time >>' >>Function ccMatch (str as String) As Boolean >> Dim regex As Object >> Dim ccpattern as Variant >> Dim regexMatch As Boolean >> Dim matches As MatchCollection >> >> ccMatch = 0 >> ccpattern = "(\d+((\ |-)?\d+)+)" >> >> Set regex = CreateObject("VBScript.RegExp") >> regexMatch = True >> regex.Global = True >> regex.ignorecase = True >> >> ' test for cc number >> regex.pattern = ccpattern >> regexMatch = regex.test(str) >> >> If (regexMatch) Then >> ' got a match now substitute your string >> ' matches(0).submatches(0) should contain the cc number >> >> Set matches = regex.Execute(str) >> >> ' once you step here look at the properties for the matches object >> ' >> ' the submatches index is the parenthesis order starting >> ' from left to right--can be viewed in the debug window >> ' while manually stepping >> ccnumber = matches(0).submatches(0) >> >> ' now you can use your best method for replacing the cc number >> ' with your string >> ' regex.replace >> >> ccMatch = 1 >> End If >> >>End Function >> >>hth. Gotta go, Dr. Who is on and then BSG. SciFi Friday. >> >>Mike... >> >> >>*********** REPLY SEPARATOR *********** >> >>On 4/18/2008 at 6:12 PM Mark A Matte wrote: >> >>>Thanks Mike, >>> >>>I had already considered the different lengths and seperators... this >>>,"(\d+((\ |-)?\d+)+)", intrigues me...what do I do with it/how do i call >>>it??? The numbers I'm looking for are in the middle of the text of a > MEMO >>>field. >>> >>>Thanks again, >>> >>>Mark A. Matte >>> >>> >>>> Date: Fri, 18 Apr 2008 12:32:17 -0400 >>>> From: jedi at charm.net >>>> To: accessd at databaseadvisors.com >>>> Subject: Re: [AccessD] Search for credit card numbers >>>> >>>> Hi Mark, your best solution is to use a regular expression to match a >>>> pattern of numbers. CC numbers can have dashes or spaces separating the >>>> number groups or can be contiguous--just depends on how it was written. >>>> For example using a pattern like >>>> >>>> (\d+((\ |-)?\d+)+) >>>> >>>> Meaning: >>>> 1. The first set of parens (outer) capture the whole matching CC > number. >>>> 2. The first \d+ means one or more digits >>>> 3. The ((\ |-)?\d+) means the next char either a space or "-" may exist >>>> (because of the ?) and then again 1 or more digits >>>> 4. And the final + is one or more of the pattern in #3. >>>> >>>> would cover 3 possible patterns >>>> 0000-0000-0000-0000 >>>> 0000 0000 0000 0000 >>>> 0000000000000000 >>>> >>>> CC number length range from 13 to 16 digits so this should catch them. >>>> however this is not foolproof. If you happen to have some other number >>>> that matches that pattern then it too will get caught. >>>> >>>> If you want to determine the issuer then a simple case statement >>matching >>>> the identifier will suffice. >>>> >>>> Give this some thought. >>>> >>>> Mike... >>>> >>>> >>>>> >>>>> Hello All, >>>>> >>>>> I'm getting ready to build something that searches MEMO and text > fields >>>>> for credit card numbers (card number NOT known)...and then replace >>them. >>>>> >>>>> Before I got started, I was wondering if anyone has any advice...or > has >>>>> done somthing similar. >>>>> >>>>> Thanks, >>>>> >>>>> Mark A. Matte >>>>> _________________________________________________________________ >>>>> Use video conversation to talk face-to-face with Windows Live >>Messenger. >>>>> >>>http://www.windowslive.com/messenger/connect_your_way.html?ocid=TXT_TAGL > M >>_WL_Refresh_messenger_video_042008 >>>>> -- >>>>> AccessD mailing list >>>>> AccessD at databaseadvisors.com >>>>> http://databaseadvisors.com/mailman/listinfo/accessd >>>>> Website: http://www.databaseadvisors.com >>>>> >>>> >>>> >>>> -- >>>> AccessD mailing list >>>> AccessD at databaseadvisors.com >>>> http://databaseadvisors.com/mailman/listinfo/accessd >>>> Website: http://www.databaseadvisors.com >>> >>>_________________________________________________________________ >>>Pack up or back up–use SkyDrive to transfer files or keep extra copies. >>>Learn how. >>>http://www.windowslive.com/skydrive/overview.html?ocid=TXT_TAGLM_WL_Refr > e >>sh_skydrive_packup_042008 >>>-- >>>AccessD mailing list >>>AccessD at databaseadvisors.com >>>http://databaseadvisors.com/mailman/listinfo/accessd >>>Website: http://www.databaseadvisors.com >> >> >> >> >> >>-- >>AccessD mailing list >>AccessD at databaseadvisors.com >>http://databaseadvisors.com/mailman/listinfo/accessd >>Website: http://www.databaseadvisors.com > > > > _________________________________________________________________ More immediate than e-mail? Get instant access with Windows Live Messenger. http://www.windowslive.com/messenger/overview.html?ocid=TXT_TAGLM_WL_Refresh_instantaccess_042008