Home |
Search |
Today's Posts |
|
#1
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
To clarify, the regex should return " Raffles Traders" from the string
below: NRK2D 986123456789312 Raffles Traders The regex (\d{15,16})([\s\S]*) is returning "986123456789312 Raffles Traders" Regards, Raj On May 2, 12:08*am, Lars-Åke Aspelin wrote: On Sat, 01 May 2010 14:47:46 -0400, Ron Rosenfeld wrote: On Sat, 1 May 2010 05:39:32 -0700 (PDT), Raj wrote: Hi, The regular expression (\d{15,16}) matches a substring in a cell. I want to extract the remaining part of the cell ie. from the character after the matched substring till the end of the string in the cell using a regular expression. Is it possible to do this? Thanks in advance for the help. Regards, Raj (\d{15,16})([\s\S]*) will capture everything in the cell and after your "match" into Group 2 --ron Can't [\s\S] be replaced by . like this (\d{15,16})(.*) Lars-Åke |
#2
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
Just in case you are interested, here is some non-RegEx code that finds the
same part of your text (the result is returned in the variable named TailEnd)... Text = "NRK2D 986123456789312 Raffles Traders" For X = 1 To Len(Text) If Mid(Text, X, 15) Like String(15, "#") Then TailEnd = Mid(Text, X + 15) Exit For End If Next -- Rick (MVP - Excel) "Raj" wrote in message ... To clarify, the regex should return " Raffles Traders" from the string below: NRK2D 986123456789312 Raffles Traders The regex (\d{15,16})([\s\S]*) is returning "986123456789312 Raffles Traders" Regards, Raj On May 2, 12:08 am, Lars-Åke Aspelin wrote: On Sat, 01 May 2010 14:47:46 -0400, Ron Rosenfeld wrote: On Sat, 1 May 2010 05:39:32 -0700 (PDT), Raj wrote: Hi, The regular expression (\d{15,16}) matches a substring in a cell. I want to extract the remaining part of the cell ie. from the character after the matched substring till the end of the string in the cell using a regular expression. Is it possible to do this? Thanks in advance for the help. Regards, Raj (\d{15,16})([\s\S]*) will capture everything in the cell and after your "match" into Group 2 --ron Can't [\s\S] be replaced by . like this (\d{15,16})(.*) Lars-Åke |
#3
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
On Sat, 1 May 2010 17:32:04 -0400, "Rick Rothstein"
wrote: Just in case you are interested, here is some non-RegEx code that finds the same part of your text (the result is returned in the variable named TailEnd)... Text = "NRK2D 986123456789312 Raffles Traders" For X = 1 To Len(Text) If Mid(Text, X, 15) Like String(15, "#") Then TailEnd = Mid(Text, X + 15) Exit For End If Next -- Rick (MVP - Excel) Rick, The OP's original regex (\d{15,16}) will capture the first 15 *OR 16* digit string into capture group 1. So when the *rest* of the string is returned, it will omit digit 16 if present. Your code will return the 16th digit, if present, as a part of "TailEnd" --ron |
#4
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
Okay, I wasn't entirely sure what the "15,16" meant in the pattern. If the
numbers are always followed by a space (is that what the "\s\S" part of your expression is for?), my code could be modified to this... Text = "NRK2D 3298613456378931 Raffles Traders" For X = 1 To Len(Text) If Mid(Text, X, 16) Like String(15, "#") & " " Then TailEnd = Mid(Text, X + 15) Exit For End If Next -- Rick (MVP - Excel) "Ron Rosenfeld" wrote in message ... On Sat, 1 May 2010 17:32:04 -0400, "Rick Rothstein" wrote: Just in case you are interested, here is some non-RegEx code that finds the same part of your text (the result is returned in the variable named TailEnd)... Text = "NRK2D 986123456789312 Raffles Traders" For X = 1 To Len(Text) If Mid(Text, X, 15) Like String(15, "#") Then TailEnd = Mid(Text, X + 15) Exit For End If Next -- Rick (MVP - Excel) Rick, The OP's original regex (\d{15,16}) will capture the first 15 *OR 16* digit string into capture group 1. So when the *rest* of the string is returned, it will omit digit 16 if present. Your code will return the 16th digit, if present, as a part of "TailEnd" --ron |
#5
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
On Sat, 1 May 2010 20:19:07 -0400, "Rick Rothstein"
wrote: Okay, I wasn't entirely sure what the "15,16" meant in the pattern. If the numbers are always followed by a space (is that what the "\s\S" part of your expression is for?), my code could be modified to this... Whatever it is that follows the string of digits is undefined in the OP's specifications. It could be a space; it could be another digit; it could be an alpha character; it could be nothing. That is a problem with the specification. Also, whatever it is that precedes the string of digits is ALSO unspecified. It could even be another digit! If, as in the OP's example, the string of digits is ALWAYS preceded and followed by a space, then his regex should have been something like: \s\d{15,16}\s If he only wanted to capture the standalone string of digits, then \s(\d{15,16})\s would capture just the digits into Group 1. and, expanding on that, \s\d{15,16}\s+([\s\S]*) would also capture everything after the string of digits into group 2 except for the leading <space's before group 2. In my suggestion, the [\s\S] will match every character that is either a <space or not a <space. In other words, it captures everything. If all I wanted to do was return everything in the string that came after a 15 or 16 digit number, that was bounded by spaces, I would just replace the beginning of the string with nothing. It's much simpler, and probably faster. =================================== Option Explicit Function Part2(s As String) As String Dim re As Object Set re = CreateObject("vbscript.regexp") re.Pattern = "^[\s\S]+\s\d{15,16}\s+" Part2 = re.Replace(s, "") End Function ==================================== If I wanted to include the space prior to " Raffles Traders" as the OP did in his example, then perhaps I would use this pattern: re.Pattern = "^[\s\S]+\s\d{15,16}\b" Now this would return the unaltered string if there was no match, but we could easily test for that, depending on what the OP wanted to do in that instance. ----------------- if re.test(s) = true then part2 = re.replace(s,"") else part2 = "no pattern match" end if -------------------- --ron |
#6
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
Thanks for the solved problem and the learning about submatches that I
was not aware of. Regards, Raj On May 2, 5:58*am, Ron Rosenfeld wrote: On Sat, 1 May 2010 20:19:07 -0400, "Rick Rothstein" wrote: Okay, I wasn't entirely sure what the "15,16" meant in the pattern. If the numbers are always followed by a space (is that what the "\s\S" part of your expression is for?), my code could be modified to this... Whatever it is that follows the string of digits is undefined in the OP's specifications. *It could be a space; it could be another digit; it could be an alpha character; it could be nothing. *That is a problem with the specification. Also, whatever it is that precedes the string of digits is ALSO unspecified. It could even be another digit! If, as in the OP's example, the string of digits is ALWAYS preceded and followed by a space, then his regex should have been something like: \s\d{15,16}\s If he only wanted to capture the standalone string of digits, then \s(\d{15,16})\s *would capture just the digits into Group 1. and, expanding on that, \s\d{15,16}\s+([\s\S]*) *would also * * * * capture everything after the string of digits into group 2 except for the leading <space's before group 2. In my suggestion, the [\s\S] will match every character that is either a <space or not a <space. *In other words, it captures everything. If all I wanted to do was return everything in the string that came after a 15 or 16 digit number, that was bounded by spaces, I would just replace the beginning of the string with nothing. *It's much simpler, and probably faster. =================================== Option Explicit Function Part2(s As String) As String *Dim re As Object Set re = CreateObject("vbscript.regexp") *re.Pattern = "^[\s\S]+\s\d{15,16}\s+" *Part2 = re.Replace(s, "") End Function ==================================== If I wanted to include the space prior to " Raffles Traders" as the OP did in his example, then perhaps I would use this pattern: re.Pattern = "^[\s\S]+\s\d{15,16}\b" Now this would return the unaltered string if there was no match, but we could easily test for that, depending on what the OP wanted to do in that instance. ----------------- if re.test(s) = true then * * * * part2 = re.replace(s,"") else * * * * part2 = "no pattern match" end if -------------------- --ron |
#7
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
On Sun, 2 May 2010 07:52:40 -0700 (PDT), Raj wrote:
Thanks for the solved problem and the learning about submatches that I was not aware of. Regards, Raj Glad to help. Thanks for the feedback. In your initial posting, you had your regex within parentheses: (\d{15,16}) ^ ^ That captures that result into a capturing group, which, in VBA, is referenced as a submatch. That was why I assumed that you were aware of that concept. I should have been more explicit. --ron |
#8
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
On Sat, 1 May 2010 13:41:03 -0700 (PDT), Raj wrote:
To clarify, the regex should return " Raffles Traders" from the string below: NRK2D 986123456789312 Raffles Traders The regex (\d{15,16})([\s\S]*) is returning "986123456789312 Raffles Traders" Regards, Raj Obviously, you are not doing what I suggested which was to return the *SECOND* matching group. You are returning the ENTIRE match. Here's an example as to returning the *SECOND* match using VBA: =============================== Option Explicit Function Part2(s As String) As String Dim re As Object, mc As Object Set re = CreateObject("vbscript.regexp") re.Pattern = "(\d{15,16})([\s\S]*)" If re.test(s) = True Then Set mc = re.Execute(s) Part2 = mc(0).submatches(1) End If End Function ================================== --ron |
Reply |
Thread Tools | Search this Thread |
Display Modes | |
|
|
![]() |
||||
Thread | Forum | |||
RegExp not matching what I want | Excel Programming | |||
RegExp & VB Noob Qs | Excel Programming | |||
RegExp | Excel Programming | |||
RegExp information | Excel Programming | |||
RegExp - String in VBA | Excel Programming |