用于逗号分隔值的XSD正则表达式模式

时间:2016-01-15 23:37:15

标签: regex xml xsd xsd-validation

我为字符串参数定义了一个XSD,它接受5个参数,这些参数可以包含字母数字逗号分隔的名称(如a1,ABC1,jack2或a1,b1,c,d1,e)。但是当我给出类似" a1,AB1和#34;的字符串时,这会产生问题。而a1,a2工作正常。模式值有什么问题?

<xs:attribute name="paramList" >
   <xs:simpleType>  
   <xs:restriction base="xs:string">    
   <xs:pattern value="([a-zA-Z0-9])*(,[a-z0-9])*(,([a-z0-9])*(,[a-z0-9])*(,[a-z0-9])*)"/>
  </xs:restriction> 
</xs:simpleType>

2 个答案:

答案 0 :(得分:1)

  

当我给出类似&#34; a1,AB1&#34;的字符串时出现问题而a1,a2工作正常。模式值有什么问题?

在您的模式中,您正确考虑第一个值的大写和小写字母:

([a-zA-Z0-9])*

但是,您只允许使用小写字母表示以下值:

(,[a-z0-9])*

因此,要解决您的主要问题,请将A-Z添加到其他括号中:

(,[a-zA-Z0-9])*

与您的描述相比,您的模式还有另一个问题。你说有

  

5个可以包含字母数字逗号分隔名称的参数

如果我理解正确,您希望允许以逗号分隔的(最多)五个值列表。

但是,您在捕获组中包含逗号,并用星号标记整个捕获组,这意味着它可能从零到无限次出现。像这样,单个模式片段

(,[a-z0-9])*

将匹配任意数量的逗号分隔值,而不只是一个。但是,这些值中的每一个都只能由一个字母数字字符组成。我想你想写

(,[a-z0-9]*)

强制执行一个逗号和任意数量的字母数字字符。

答案 1 :(得分:1)

我建议这种模式用于1到5个以逗号分隔的参数名称:

<xs:pattern value="[a-zA-Z][a-zA-Z0-9]*(\s*,\s*[a-zA-Z][a-zA-Z0-9]*){0,4}"/>

注意:

  • 参数名称通常必须以字母开头,而不是数字。
  • 空格通常可能存在于逗号之前或之后。
  • {0,4}出现说明符胜过扩展重复。
  • 参数名称有时允许_;如果需要,可以添加到[a-zA-Z0-9](两个地方)。