<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.5.7638.1">
<TITLE>Regex question</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/rtf format -->

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">Hi All,</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">  Got a regex thing I can</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">’t explain, but it may of course be down to my inexperience with regexs generally. Please forgive the non</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">-</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">ideal email address</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri"> regex</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">, it’s not great, but not really my focus here at this point</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">, I aim to improve it.</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri"> For now it’s as simple as I can make it, having paired it down to hopefully find the problem.</FONT></SPAN><SPAN LANG="en-gb"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">We’re using a captive portal which only allows pass-through of a username and password as user “fields”. The system uses voucher auth, so we don</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">’t actually use the password field for a password, rather using it to capture email address, browser agent, version and OS details from the client’s browser.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">This is a via the user-password string in the format</FONT></SPAN><SPAN LANG="en-gb"> <FONT FACE="Calibri">field:<string> field2:<string></FONT></SPAN><SPAN LANG="en-gb"> <FONT FACE="Calibri"> - fields, with the string following a colon, separated by spaces.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">e.g.</FONT></SPAN><SPAN LANG="en-gb"> </SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">em</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">ai</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">l:my.email@address.com browseragent:safari version:7 os:ios5</FONT></SPAN><SPAN LANG="en-gb"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">The string is passed through a few regexes, each picking off the field string in a</FONT></SPAN><SPAN LANG="en-gb"> <FONT FACE="Calibri">capture</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri"></FONT></SPAN><SPAN LANG="en-gb"> <FONT FACE="Calibri">group. It’s failing on the first, the email regex being</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri"> pretty simple</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">:</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">^email:([a-z0-9._-]</FONT></SPAN><SPAN LANG="en-gb"></SPAN><A HREF="mailto:+@[a-z0-9.-]+\.[a-z]{2,4}"><SPAN LANG="en-gb"><U><FONT COLOR="#0000FF" FACE="Calibri">+@[a-z0-9.-]+\.[a-z]{2,4}</FONT></U></SPAN><SPAN LANG="en-gb"></SPAN></A><SPAN LANG="en-gb"><FONT FACE="Calibri">)</FONT></SPAN><SPAN LANG="en-gb"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">I’ve tried various delimiters</FONT></SPAN><SPAN LANG="en-gb"> <FONT FACE="Calibri"> but all result in the same issue:</FONT></SPAN><SPAN LANG="en-gb"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">em</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">ai</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">l:my.email@address.com</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">,</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">browseragent:safari</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">,</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">version:7</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">,</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">os:ios5</FONT></SPAN><SPAN LANG="en-gb"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">em</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">ai</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">l:my.email@address.com</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">#</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">browseragent:safari</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">#</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">version:7</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">#</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">os:ios5</FONT></SPAN><SPAN LANG="en-gb"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">I’ve also tried compiling with and without libpcre3-dev, same</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri"> -</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri"> the regex is not stopping at the space or , or #, whatever delimiter I choose.</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri"> The non email regexes seem to work ok..</FONT></SPAN><SPAN LANG="en-gb"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">Code :</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri"> (in policy.d folder)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">e</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri">mail_regexp=</FONT></SPAN><SPAN LANG="en-gb"><FONT FACE="Calibri"> "^email:([a-z0-9._-]+@[a-z0-9.-]+\\.[a-z]{2,4})"</FONT></SPAN><SPAN LANG="en-gb"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">  if ("%{User-Password}" =~ /${policy.email_regexp}/){</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">    update control {</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">      Email-Address := "%{1}"</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">    }</FONT></SPAN><SPAN LANG="en-gb"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">}</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">Result:</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">    ? if ("%{User-Password}" =~ /^email:([a-z0-9._-]+@[a-z0-9.-]+\.[a-z]{2,4})/)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)     expand: "%{User-Password}" -> 'email:my.email@address.com browseragent:safari version:7 os:ios5'</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)    ? if ("%{User-Password}" =~ /^email:([a-z0-9._-]+@[a-z0-9.-]+\.[a-z]{2,4})/) -> TRUE</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)    if ("%{User-Password}" =~ /^email:([a-z0-9._-]+@[a-z0-9.-]+\.[a-z]{2,4})/) {</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)     update control {</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)     expand: "%{1}" -> 'my.email@address.com brow'</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)             Email-Address := "my.email@address.com brow"</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)     } # update control = noop</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)     [noop] = noop</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)    } # if ("%{User-Password}" =~ /^email:([a-z0-9._-]+@[a-z0-9.-]+\.[a-z]{2,4})/) = noop</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)     ... skipping else for request 0: Preceding "if" was taken</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)   } # check_email_address check_email_address = noop</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)   check_browser_agent check_browser_agent {</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)    ? if ("%{User-Password}" =~ /browseragent:([a-z0-9_-]+)/)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)     expand: "%{User-Password}" -> 'email:my.email@address.com browseragent:safari version:7 os:ios5'</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)    ? if ("%{User-Password}" =~ /browseragent:([a-z0-9_-]+)/)  -> TRUE</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)    if ("%{User-Password}" =~ /browseragent:([a-z0-9_-]+)/)  {</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)     update control {</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)     expand: "%{1}" -> 'safari'</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)             Browser-Agent := "safari"</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)     } # update control = noop</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)    } # if ("%{User-Password}" =~ /browseragent:([a-z0-9_-]+)/)  = noop</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)   } # check_browser_agent check_browser_agent = noop</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)   check_browser_version check_browser_version {</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)    ? if ("%{User-Password}" =~ /version:([a-z0-9_-]+)/)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)     expand: "%{User-Password}" -> 'email:my.email@address.com browseragent:safari version:7 os:ios5'</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)    ? if ("%{User-Password}" =~ /version:([a-z0-9_-]+)/)  -> TRUE</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)    if ("%{User-Password}" =~ /version:([a-z0-9_-]+)/)  {</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)     update control {</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)     expand: "%{1}" -> '7'</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)             Browser-Version := "7"</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)     } # update control = noop</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)    } # if ("%{User-Password}" =~ /version:([a-z0-9_-]+)/)  = noop</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)   } # check_browser_version check_browser_version = noop</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)   check_browser_os check_browser_os {</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)    ? if ("%{User-Password}" =~ /os:([a-z0-9_-]+)$/)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)     expand: "%{User-Password}" -> 'email:my.email@address.com browseragent:safari version:7 os:ios5'</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)    ? if ("%{User-Password}" =~ /os:([a-z0-9_-]+)$/)  -> TRUE</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)    if ("%{User-Password}" =~ /os:([a-z0-9_-]+)$/)  {</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)     update control {</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)     expand: "%{1}" -> 'ios5'</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(0)             Browser-OS := "ios5"</FONT></SPAN><SPAN LANG="en-gb"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">I also tried a different regex, but the problems seem worse there..</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">    ? if ("%{User-Password}" =~ /^email:([a-z0-9_-]+(\.[a-z0-9_-]+)*@[a-z0-9_-]+(\.[a-z0-9_-]+)*(\.[a-z]{2,4}))/)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(1)     expand: "%{User-Password}" -> 'email:my.email@address.com browseragent:safari version:7 os:ios5'</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(1)    ? if ("%{User-Password}" =~ /^email:([a-z0-9_-]+(\.[a-z0-9_-]+)*@[a-z0-9_-]+(\.[a-z0-9_-]+)*(\.[a-z]{2,4}))/) -> TRUE</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(1)    if ("%{User-Password}" =~ /^email:([a-z0-9_-]+(\.[a-z0-9_-]+)*@[a-z0-9_-]+(\.[a-z0-9_-]+)*(\.[a-z]{2,4}))/) {</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(1)     update control {</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(1)     expand: "%{1}" -> 'my.email@address.com browseragent:safari version:7 os:ios'</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(1)             Email-Address := "my.email@address.com browseragent:safari version:7 os:ios"</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">(1)     } # update control = noop</FONT></SPAN><SPAN LANG="en-gb"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">Any ideas what I’m doing wrong?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">Thanks</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-gb"><FONT FACE="Calibri">andy</FONT></SPAN><SPAN LANG="en-gb"></SPAN></P>

</BODY>
</HTML>