0

XML の要素として ID 番号を受け取る Web サービス用の XSD の作成に取り組んでいます。これらの 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

私はあなたの制限を少し言い換えます:

  • 1 桁目を . にすることはできません6
  • 最後の 2 桁のうち少なくとも 1 桁がゼロであってはなりません。
  • 中央の 4 桁の少なくとも 1 つがゼロであってはなりません。

最初の制限 (0 のみで構成される ID) は、実際には最後の 2 つの制限に含まれています。

6最初の制限は、を含まない一連の許可された文字で表すことができます[0-57-9]

他の制限については、単純な解決策は、ゼロだけで構成されていてはならず、ゼロ以外の数字を想定してはならないセクションの先頭から開始することです。その仮定が正しい場合、残りの桁にはゼロが含まれる場合があります。それ以外の場合、そのセクションの最初の数字はゼロでなければならず、残りの文字については、1 文字だけが残るまでこの規則を再帰的に繰り返すことができます。([1-9][0-9]{3}|0(... repeat for three digits, then two digits, ...))

したがって、適切な正規表現は次のようになります。

[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])

更新:追加の制限には、次のものが必要です。

  • 最初の 3 桁のうち少なくとも 1 桁は0.
  • 最初の 3 桁のうち少なくとも 1 桁は9.

これは上記と同じ方法で含めることができ、 と 以外0のもの9、または次の 2 つの数値のいずれかを受け入れます。

([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]))

そう、

  • ID が a0でもa でも始まらない9。その場合、次の 2 桁の制限はありません。
  • または ID は . で始まります0。その場合、最初の数字でも 2 番目の数字でも、次の 2 桁のいずれかがゼロであってはなりません。
  • または ID は . で始まります9。その場合、最初の数字でも 2 番目の数字でも、次の 2 桁のいずれかが 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}次の 2 文字は任意の数字です。

次に(...|...|...|...)、これらすべてを ORing するセクションがあります。

[1-9]\d{3}次の 4 桁のうち、最初の桁をゼロにすることはできません。

また

\d[1-9]\d{2}次の 4 つのうち、2 番目をゼロにすることはできません。

また

\d{2}[1-9]\dまたは 3 番目はゼロではありません。

また

\d{3}[1-9]または 4 番目はゼロではありません。

次に、別の\d、任意の数字があります。

ついに、

([1-9]\d|\d[1-9])最後の 2 桁の 1 番目または 2 番目を 0 にすることはできません。

少なくとも 1 つの数値がゼロでないことを要求するセクションが 2 つあるため、10 個すべてをゼロにする方法はありません。

于 2012-08-02T21:20:43.733 に答える