0

我正在为一个 Web 服务创建一个 XSD,它将一个 ID 号作为 XML 中的一个元素。这些 ID 号由 10 个连续数字 ([0-9]{10}) 组成,但我试图创建一个正则表达式,可以排除此范围内的某些元素。

例如,这是我目前在 XSD 中的限制:

    <xsd:restriction base="xsd:string">
        <xsd:pattern value="[0-9]{10}" />
    </xsd:restriction>  

我需要限制以允许不符合以下 ID 的 [0-9]{10} 字符串:

    All 0's:         [0]{10}
    Starting with 6: [6][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]
    Starting with 000: [0][0][0][0-9][0-9][0-9][0-9][0-9][0-9][0-9]
    Starting with 999: [9][9][9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]
    Ends with 2 0's: [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0][0]
    4 0's in Middle: [0-9][0-9][0-9][0][0][0][0][0-9][0-9][0-9]

这可以从 XSD 或正则表达式中完成吗?

谢谢。

4

2 回答 2

0

我会改写你的限制:

  • 第一个数字不能是 a 6
  • 最后两位数字中至少有一位不能为零。
  • 至少中间四位数字中的一位不得为零。

第一个限制,一个仅由零组成的 ID,实际上包含在最后两个限制中。

第一个限制可以由一组不包括的允许字符表示6,即[0-57-9]

对于其他限制,一个直接的解决方案是从一个部分的开头开始,该部分不能仅由零组成并假定一个非零数字;如果该假设成立,则其余数字可能包括零;否则该部分中的第一个数字必须为零,对于剩余的字符,可以递归地重复此规则,直到只剩下一个字符:([1-9][0-9]{3}|0(... repeat for three digits, then two digits, ...))

因此,合适的 RegEx 将是:

[0-57-9][0-9]{2}([1-9][0-9]{3}|0([1-9][0-9]{2}|0([1-9][0-9]|0[1-9])))[0-9]([1-9][0-9]|0[1-9])

更新:附加限制需要以下内容:

  • 前三个数字中至少有一个不能是0.
  • 前三个数字中至少有一个不能是9.

这可以以与上述相同的方式包含,接受除0and之外的任何内容9,或这两个数字中的任何一个:

([1-57-8][0-9]{2}|0([1-9][0-9]|[0-9][1-9])|9([0-8][0-9]|[0-9][0-8]))([1-9][0-9]{3}|0([1-9][0-9]{2}|0([1-9][0-9]|0[1-9])))[0-9]([1-9][0-9]|0[1-9])

新部分位于表达式的前面:

([1-57-8][0-9]{2}|0([1-9][0-9]|[0-9][1-9])|9([0-8][0-9]|[0-9][0-8]))

所以,

  • 0ID 既不以 a也不以开头9。在这种情况下,接下来的两位数没有限制。
  • 或 ID 以0. 在这种情况下,接下来的两位数字中的一位不得为零,无论是第一个数字还是第二个数字。
  • 或 ID 以9. 在这种情况下,接下来的两位数字中的一位不能是 9,无论是第一个数字还是第二个数字。
于 2012-08-02T21:17:07.420 回答
0

我认为这将涵盖它:

[01-57-9]\d{2}([1-9]\d{3}|\d[1-9]\d{2}|\d{2}[1-9]\d|\d{3}[1-9])\d([1-9]\d|\d[1-9])

分解:

[01-57-9]第一个字符是数字非 6。

\d{2}接下来的两个字符可以是任何数字。

然后有一个(...|...|...|...)部分,将所有这些 ORing 在一起。

[1-9]\d{3}在接下来的 4 位数字中,第一位不能为零。

或者

\d[1-9]\d{2}在接下来的 4 个中,第二个不能为零。

或者

\d{2}[1-9]\d或者第三个不为零。

或者

\d{3}[1-9]或者第四个不为零。

然后我们有另一个\d,任何数字。

最后,

([1-9]\d|\d[1-9])最后两位数中的第一个或第二个不能为 0。

由于我们有两个部分要求至少一个数字不为零,因此不可能所有 10 都为零。

于 2012-08-02T21:20:43.733 回答