【问题标题】:Maven build failed in xsd pattern validationMaven 构建在 xsd 模式验证中失败
【发布时间】:2018-08-02 11:20:32
【问题描述】:

我有一个模式:(?!^0000000000000000000)([0-9]{20}) 应该验证所有长度为= 20 的数字,不包括0000000000000000000

我正在写单元测试:

 String pattern = "(?!^0000000000000000000)([0-9]{20})";
 String input  = "0000000000000000000";
 String input1 = "0000000000000000000123123";
 String input2 = "123123"
 String input3 = "1231231244245343604";
 Assert.assertFalse(input.matches(pattern))
 Assert.assertFalse(input1.matches(pattern))
 Assert.assertFalse(input2.matches(pattern))
 Assert.assertTrue(input3.matches(pattern))

这段代码运行良好,但是当我尝试在 xsd 中使用带有模式的 maven 构建我的项目时,它会因验证模式错误而失败 我做错了什么?

【问题讨论】:

  • 您是否在 XSD 中使用 XSD 正则表达式语法的模式?你不能在那里使用环视,以及^$ 锚点。
  • @WiktorStribiżew 那么我需要如何修改我的正则表达式?
  • 一种方法是拼出替代方案:[0-9]{19}[1-9]|[0-9]{18}[1-9][0-9]|...
  • 总是乐于助人:regex101.com
  • @fl0w 并非总是如此,regex101 不支持 XSD 正则表达式语法。

标签: java regex maven xsd java-7


【解决方案1】:

我建议你使用以下限制:

<xs:restriction base="xs:unsignedLong">
    <xs:minInclusive value="1"/>
    <xs:pattern value="[0-9]{20}"/>
</xs:restriction>

这可确保您的输入是大于 00000000000000000000 的 20 位正数。

如果您需要基于字符串的类型,则必须按照Wiktor Stribiżew 建议的模式拼出所有可能的替代方案:

<xs:restriction base="xs:string">
  <xs:pattern value="[0-9]{19}[1-9]|[0-9]{18}[1-9][0-9]|[0-9]{17}[1-9][0-9]{2}|[0-9]{16}[1-9][0-9]{3}|[0-9]{15}[1-9][0-9]{4}|[0-9]{14}[1-9][0-9]{5}|[0-9]{13}[1-9][0-9]{6}|[0-9]{12}[1-9][0-9]{7}|[0-9]{11}[1-9][0-9]{8}|[0-9]{10}[1-9][0-9]{9}|[0-9]{10}[1-9][0-9]{9}|[0-9]{9}[1-9][0-9]{10}|[0-9]{8}[1-9][0-9]{11}|[0-9]{7}[1-9][0-9]{12}|[0-9]{6}[1-9][0-9]{13}|[0-9]{5}[1-9][0-9]{14}|[0-9]{4}[1-9][0-9]{15}|[0-9]{3}[1-9][0-9]{16}|[0-9]{2}[1-9][0-9]{17}|[0-9][1-9][0-9]{18}"/>
</xs:restriction>

【讨论】:

  • 在我的情况下它的字符串不长
  • @Anton 我已经更新了我的答案,将 Wiktor 的建议作为对xs:string 应用限制的解决方案,但我建议您好好考虑使用xs:unsignedLong ;)
猜你喜欢
  • 1970-01-01
  • 2021-03-09
  • 2019-06-23
  • 1970-01-01
  • 2019-05-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
相关资源
最近更新 更多