andieje
asked on
regular expression not working
Hi
I have a reg ex that is not working and i can't see for the life of me why. I have copied the text I am trying to parse into the code window. I think it will be apparent from my reg ex that I am trying to extract the exception type, its message, the target site and the strack trace.
Here is my code
errorMessage.Replace("\n", "").Replace("\r", "")
Dim regExString As String = ".*Type\s:\s(.*)Message\s: \s(.*)Sour ce.*Target Site\s:\s( .*)Stack Trace\s:\s(.*)"
Dim regEx As Regex = New Regex(regExString)
Dim m As Match
m = regEx.Match(message)
if m.success
The reg ex fails. I have been trying to break it down bit by bit. This works
Dim regExString As String = ".*Type\s:\s(.*)"
However the string that is matched is only this :
System.ArgumentException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c56193 4e089
This is confusing me. I would have thought this reg ex would match everything after 'Type : ' but for some reason it does stop where i want it to without me telling it to.
This fails Dim regExString As String = ".*Type\s:\s(.*)Message"
I really cant see why. Any help much appreciated.
thanks
I have a reg ex that is not working and i can't see for the life of me why. I have copied the text I am trying to parse into the code window. I think it will be apparent from my reg ex that I am trying to extract the exception type, its message, the target site and the strack trace.
Here is my code
errorMessage.Replace("\n",
Dim regExString As String = ".*Type\s:\s(.*)Message\s:
Dim regEx As Regex = New Regex(regExString)
Dim m As Match
m = regEx.Match(message)
if m.success
The reg ex fails. I have been trying to break it down bit by bit. This works
Dim regExString As String = ".*Type\s:\s(.*)"
However the string that is matched is only this :
System.ArgumentException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c56193
This is confusing me. I would have thought this reg ex would match everything after 'Type : ' but for some reason it does stop where i want it to without me telling it to.
This fails Dim regExString As String = ".*Type\s:\s(.*)Message"
I really cant see why. Any help much appreciated.
thanks
HandlingInstanceID: d62db6a9-a539-4d6f-95e4-8efa1f6295c4
An exception of type 'System.ArgumentException' occurred and was caught.
------------------------------------------------------------------------
07/13/2009 11:09:27
Type : System.ArgumentException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
Message : Parameter 'p_JourneyID' not found in the collection.
Source : EntitySpaces.Interfaces
Help link :
ParamName :
Data : System.Collections.ListDictionaryInternal
TargetSite : EntitySpaces.Interfaces.esDataResponse ExecuteScalar(EntitySpaces.Interfaces.esDataRequest, EntitySpaces.Interfaces.esProviderSignature)
Stack Trace : at EntitySpaces.Interfaces.esDataProvider.ExecuteScalar(esDataRequest request, esProviderSignature sig)
at EntitySpaces.Core.esEntityCollection.ExecuteScalar(esQueryType queryType, String query, esParameters parms)
at EntitySpaces.Core.esUtility.ExecuteScalar(esQueryType queryType, String query, esParameters parms)
at SureTrack2.Server.TCPClientThread.Connect() in C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\Projects\SureTrack2.Server\SureTrack2.Server\TCPClientThread.vb:line 480
Additional Info:
MachineName : OSCAR
TimeStamp : 13/07/2009 10:09:27
FullName : Microsoft.Practices.EnterpriseLibrary.ExceptionHandling, Version=2.0.0.0, Culture=neutral, PublicKeyToken=null
AppDomainName : SureTrack2.Server.vshost.exe
ThreadIdentity :
WindowsIdentity : OSCAR\Administrat
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Hi
Kaufmed,that fixed it. Please can you explain why i needed single line mode. I believe single line mode means that the . character will not stop at newline characters. That makes sense to me but i thought i had removed new line characters by doing this
errorMessage.Replace("\n", "").Replace("\r", "")
thanks
Kaufmed,that fixed it. Please can you explain why i needed single line mode. I believe single line mode means that the . character will not stop at newline characters. That makes sense to me but i thought i had removed new line characters by doing this
errorMessage.Replace("\n",
thanks
ASKER
Hi
One more thing, the reg ex doesn't quite work because it is not picking up the stack trace at the end. The reg ex test is being passed but the stack trace group of the rex ex comes back with a string length of 0. I don't understnd why its doing that either!
One more thing, the reg ex doesn't quite work because it is not picking up the stack trace at the end. The reg ex test is being passed but the stack trace group of the rex ex comes back with a string length of 0. I don't understnd why its doing that either!
See notes below.
// I believe you used the following
/* Calls replace on errorMessage, but does not modify errorMessage.
*Replace returns the modified string
*/
errorMessage.Replace("\n", "").Replace("\r", "");
// You needed to use the following
/* Calls replace and stores the result back to errorMessage */
errorMessage = errorMessage.Replace("\n", "").Replace("\r", "")
It appears I made an error with the last capture group. The last group currently is defined as (.*?), where the question mark makes the star (*) non-greedy. Try removing the question mark as I have done below, and you should get the proper results.
(?s).*?Type\s*\:\s*(.*?)Message\s*\:\s*(.*?)Source.*?TargetSite\s*\:\s*(.*?)Stack Trace\s*\:\s*(.*)
ASKER
I had to put the end of line character in for some reason
Dim regExString As String = "(?s).*?Type\s*\:\s*(.*?)M essage\s*\ :\s*(.*?)S ource.*?Ta rgetSite\s *\:\s*(.*? )Stack Trace\s*\:\s*(.*?)Addition al Info.*?$"
no idea why
Dim regExString As String = "(?s).*?Type\s*\:\s*(.*?)M
no idea why
See previous post for correction without end-of-line.
An explanation for your method:
Because I defined the last group as (.*?), the question mark tells the star to only match the minimum that will satisfy the condition--which in your original case would have been a single space. Because you put the $, the minimum condition became "all characters until the end-of-search-string is found."
An explanation for your method:
Because I defined the last group as (.*?), the question mark tells the star to only match the minimum that will satisfy the condition--which in your original case would have been a single space. Because you put the $, the minimum condition became "all characters until the end-of-search-string is found."
ASKER
Hi
So this at the start of the expression makes vb.net treat the input as a single line and not stop at newline characters: (?s)
and a ? after the * makes it non-greedy?
many thanks
So this at the start of the expression makes vb.net treat the input as a single line and not stop at newline characters: (?s)
and a ? after the * makes it non-greedy?
many thanks
ASKER
thanks
Yes.
NP. Glad to help :)
NP. Glad to help :)
Dim regExString As String = ".*Type\s:\s(.*)"
'Do what you need here to get the message
regExString As String = ".*Message\s:\s(.*)"
'Do what you need here to get the message
'Etc