Jump to content

Regular Expression Help Matching dash not in brackes


javajoemorgan
 Share

Recommended Posts

I have worked on this for hours, and cannot come up with how to do it. I need a regular expression that matches a string containing a dash that is not in any way contained in square brackets. Here are some examples of the rules:// Should matchsomething - somethingElse // Should NOT matchsomething[ 4 - 6 ]// Should matchsomething[4-6] - somethingElse// Should matchsomething - somethingElse[ 3 - 5]// Should matchsomething[4 - 6] - somethingElse[1-3]// Should NOT matchsomething[3, 4, 5-6, 7]// Should matchsomething[3, 4, 5-6, 7] - somethingElse[3, 4-5]I was thinking that if I could match what is in brackets, I could maybe figure out the negative... but I've been thinking on it so long now I'm just lost.

Link to comment
Share on other sites

At least for your samples the following work:

<xsl:stylesheet  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"  version="2.0"  xmlns:xs="http://www.w3.org/2001/XMLSchema"  exclude-result-prefixes="xs">    <xsl:output indent="yes"/>    <xsl:variable name="re" as="xs:string">^([^\[\]]*)(\[.*?\])*([^\[\]]*)\-([^\[\]]*)(\[.*?\])*([^\[\]]*)$</xsl:variable>    <xsl:template match="data[matches(., $re)]">	<matched>	  <xsl:value-of select="."/>	</matched>  </xsl:template>    <xsl:template match="data[not(matches(., $re))]">	<not-matched>	  <xsl:value-of select="."/>	</not-matched>  </xsl:template>  </xsl:stylesheet>

When applied to the input

<list>  <data>something - somethingElse</data>  <data>something[ 4 - 6 ]</data>  <data>something[4-6] - somethingElse</data>  <data>something - somethingElse[ 3 - 5]</data>  <data>something[4 - 6] - somethingElse[1-3]</data>  <data>something[3, 4, 5-6, 7]</data>  <data>something[3, 4, 5-6, 7] - somethingElse[3, 4-5]</data></list>

Saxon 9.3 outputs

  <matched>something - somethingElse</matched>  <not-matched>something[ 4 - 6 ]</not-matched>  <matched>something[4-6] - somethingElse</matched>  <matched>something - somethingElse[ 3 - 5]</matched>  <matched>something[4 - 6] - somethingElse[1-3]</matched>  <not-matched>something[3, 4, 5-6, 7]</not-matched>  <matched>something[3, 4, 5-6, 7] - somethingElse[3, 4-5]</matched>

Link to comment
Share on other sites

No wonder my head hurt so much.... I had a significant subset of it, but was definitely missing the beginning/ending bracket exclusions.. .I just had the beginning ([^\[]*) ... ([^\]]) followed by the ending... I'm still absorbing how that works... but thanks...

At least for your samples the following work:
...  <xsl:variable name="re" as="xs:string">^([^\[\]]*)(\[.*?\])*([^\[\]]*)\-([^\[\]]*)(\[.*?\])*([^\[\]]*)$</xsl:variable> ...

Edited by Java Joe Morgan
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...