【问题标题】:Why am I getting different validation between an XSD regex with Nokogiri and normal Ruby regular expressions?为什么我在带有 Nokogiri 的 XSD 正则表达式和普通 Ruby 正则表达式之间得到不同的验证?
【发布时间】:2013-05-16 20:34:17
【问题描述】:

我有一个 XSD 架构,其中包含特定字段的规则以匹配以下正则表达式:

\d{8}[\-]?[A-Za-z]{0,3}

使用 irb,我可以使用这个正则表达式进行测试,并且以下字符串都匹配,这是正确的:

12345678
12345678-
12345678-abc
12345678abc

当我尝试针对此 XSD 验证某些 XML 时,我得到的行为略有不同:

Passes:
12345678-
12345678-abc
12345678abc

Fails:
12345678

这里有一个最小的 XSD/XML 文件,可以重现这个:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
 <xs:simpleType name="codeType">
  <xs:restriction base="xs:token">
   <xs:pattern value="\d{8}[\-]?[A-Za-z]{0,3}"/>
  </xs:restriction>
 </xs:simpleType>
 <xs:element name="test">
  <xs:complexType>
   <xs:sequence>
    <xs:element type="codeType" name="code"/>
   </xs:sequence>
  </xs:complexType>
 </xs:element>
</xs:schema>

和 XML:

<?xml version="1.0" encoding="UTF-8"?>
<test>
  <code>11034755</code>
</test>

并运行它

xmllint --schema test.xsd test.xml

Element 'code': [facet 'pattern'] The value '11034755' is not accepted by the pattern '\d{8}[\-]?[A-Za-z]{0,3}'

虽然 XML 模式没有完整的正则表达式,但我认为这应该是有效的。在这种特殊情况下,对于 XSD 文件中的正则表达式,关于“? ?

【问题讨论】:

  • 由于您没有向我们提供您要验证的 XML,因此我们无法为您提供可靠的答案。重要的是要记住给我们代码、示例数据、预期输出、实际输出和一个好的解释。你做得越好,我们就能越好地为你提供帮助。记住:GIGO。

标签: ruby regex xsd nokogiri


【解决方案1】:

使用 Rubular 测试 /\d{8}-?(?:[a-zA-Z]{3})?/ 我得到所有字符串的命中。

交替使用 /\d{8}[a-zA-Z-]*//\d{8}[a-z-]*/i/\d{8}[a-z-]{0,4}/i 也可以。

您可以使用 {0,3}{,3},这样可能会有所帮助。

【讨论】:

  • /\d{8}-{0,1}[A-Za-z]{0,3}/ 也可以。看起来 '?'不像我在 XML Schemas 中所期望的那样工作。
猜你喜欢
  • 1970-01-01
  • 2014-02-25
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 2012-02-12
相关资源
最近更新 更多