Regular Expression Issues

I have a line

<a href="/makeuppro/video?st.cmd=altGroupVideoAll&amp;st.groupId=oqxdtikenuenvnwuj0rxiwhgvyuvhjhzjrd&amp;st.directLink=on&amp;st.referenceName=makeuppro&amp;st._aid=NavMenu_AltGroup_Video"

I need to get groupID oqxdtikenuenvnwuj0rxiwhgvyuvhjhzjrd .

I tried

 string groupId = Regex.Match(content, @"altGroupVideoAll&amp;st.groupId=(?<id>[^""]+)&amp").Groups["id"].Value; 

But the result was:

 oizrximcmbsyyvjxacd0rpkkmgxwuvhinnuvczz&amp;st.directLink=on&amp;st.referenceName=makeuppro 

Why the correct regular expression?

+4
source share
3 answers

You need to use a reluctant quantifier to stop at the first & : -

 @"altGroupVideoAll&amp;st.groupId=(?<id>[^""]+?)&amp" 
+4
source

Try the following:

 groupId=(?<id>[^&]+) 

I suspect that the identifier will not contain a character either. Your original regex is greedy and trying to match the longest string.

0
source

Hy @ user1895750 and @Jared Harley,

You are confused in Lazy and Greedy Expression, see the code below.

  /// <summary> /// Example for how to extract the group Id. /// </summary> /// <param name="xml"></param> /// <returns></returns> private static string ExtractNumber(string xml) { // Extracted number. string groupId = string.Empty; // Input text xml = @"<a href=""/makeuppro/video?st.cmd=altGroupVideoAll&amp;st.groupId=oqxdtikenuenvnwuj0rxiwhgvyuvhjhzjrd&amp;st.directLink=on&amp;st.referenceName=makeuppro&amp;st._aid=NavMenu_AltGroup_Video"""; // Here is the key, you have to use "?" after "(?<id>[^\"\"]+" // This is called "Lazy expression", and it is different from the "Greedy expression". // Lazy expression uses the "?", like ".*?\r". So it will match the expression until they find the first carriage return (\r). // If you use ".*\r" (Greedy Expression), it will match until they find the last carriage return of the input. Thats why you matched ("&amp;st.directLink=on&amp;st.referenceName=makeuppro"), because the last "&amp" is after "makeuppro" . // Here the correct pattern. var pattern = "groupId=(?<id>[^\"\"]+?)&amp"; // Match the desired part of the input. var match = Regex.Match(xml, pattern); // Verify the match sucess. if (match.Success) { // Finally, use the group value to isolate desired value. groupId = match.Groups["id"].Value; } return groupId; } 

Hope this helps you!

Yours faithfully,

0
source

All Articles