在XSD中拆分正则表达式模式限制

问题描述:

我的XSD中有一个正则表达式模式,但可读性很差。在XSD中拆分正则表达式模式限制

<xs:element name="short_description"> 
       <xs:simpleType> 
        <xs:restriction base="xs:string"> 
         <xs:pattern value="|^([a-zA-Z0-9áÁâÂàÀäÄåÅöÖòÒóÓôÔøØüÜûÛùÙúÚßíÍïÏîÎìÌñÑÇç.,?()!\/çéÉêÊèÈëË +;&amp;&apos;':&quot;\n\t%#£°€@=«»¦*`´-]){1,}$"/> 
        </xs:restriction> 
       </xs:simpleType> 
</xs:element> 

所以我想单独作为下面的一个更好的可读性(例如)

<xs:element name="title"> 
     <xs:simpleType> 
      <xs:restriction base="xs:string"> 
       <!-- Check the title with no limitation to size --> 
       <xs:pattern value="|^([a-zA-Z0-9áÁâÂàÀäÄåÅöÖòÒóÓôÔøØüÜûÛùÙúÚßíÍïÏîÎìÌñÑÇçéÉêÊèÈëË]){1,}$"/> 
       <xs:pattern value="|^([.,?()!\/ +;':`´-]){1,}$"/> 
       <xs:pattern value="|^([&amp;$apos;&quot;]){1,}$"/> 
       <xs:pattern value="|^([\n\t]){1,}$"/> 
       <xs:pattern value="|^([%#£°€@=«»¦*]){1,}$"/> 
      </xs:restriction> 
     </xs:simpleType> 
    </xs:element> 

重新运行我的XSD似乎他只是在看第一线的时候,图案被分开后。

有没有办法让第一个模式(见上面)更具可读性?或者我在第二个例子中做错了什么?

+0

你确定你的模式有效吗?第一个应该做的是什么? '''''''''代表什么?你的意思是'''?看起来你需要使用1个正则表达式,['] [a-zA-Z0-9áÁüâÃÂÃÂÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃà '' - ] +“'](https://regex101.com/r/GiXSXy/1),因为将它分成单独的不一样。 –

+0

是的,他们的工作,事实上,它必须是'。 但是,也许我们应该忽略这个问题,如果它的工作与否;)使它更一般。如果你有这样一个正则表达式,你能把它分成多行吗? – Dragonix

+1

你不能把'[^ a-z0-9]'分割成'[^ a-z] | [^ 0-9]'。它打破了整个功能并匹配任何字符。 –

您可以使用multiple patterns,但它们之间的关系是OR,而不是AND:

包含不止一个<pattern>元素的XML <restriction>产生了一个单·正则表达式·中集;这个正则表达式是正则表达式的“或”,它是<pattern>元素的内容。

如果你有[A-Za-z]+然后[0-9]+,这意味着你允许值,仅由1个或多个字母(第一个)或1+数字(第二)。这并不意味着你允许一个由一个或多个字母或数字组成的字符串。

正是在这种情况下,更安全的写模式作为一个单一的限制:

<xs:pattern value="([a-zA-Z0-9áÁâÂàÀäÄåÅöÖòÒóÓôÔøØüÜûÛùÙúÚßíÍïÏîÎìÌñÑÇç.,?()!/çéÉêÊèÈëË +;&amp;&apos;:&quot;\n\t%#£°€@=«»¦*`´-]+)?" /> 

需要注意的是:

  • 要可选模式(即允许空匹配)更安全以封闭带有可选组整个图案((<PATTERN>)?
  • $apos;&apos;
  • XML模式的正则表达式ps默认为锚定,^$不应该使用
  • 要支持Unicode字母,您可以考虑只使用\p{L} Unicode类别类。
+0

谢谢!非常感谢 – Dragonix

+0

我希望我能,但我没有足够的声望点upvote(我需要15,所以剩下5) – Dragonix

+0

完成,谢谢!还有一个问题。这个'\ p {L}'听起来很有趣,但我找不到在我的正则表达式中实现它们的好例子。我试过'([\ p {L}] +)?'但没有成功。 – Dragonix

在@WiktorStribiżew的帮助下,我找到了答案。

  1. 这是不可能在这样的XSD拆分正则表达式,我使用它
  2. 正则表达式也提高了 - '>([a-zA-Z0-9áÁâÂàÀäÄåÅöÖòÒóÓôÔøØüÜûÛùÙúÚßíÍïÏîÎìÌñÑÇç.,?()!/çéÉêÊèÈëË +;&amp;&apos;:&quot;\n\t%#£$°€@=«»¦* - ] +)`

? - >此正则表达式允许1到人物众多

- >它还允许空标签

它允许有多个模式方面:如果你这样做,必须输入他们中的任何一个相匹配。 (这有点违反直觉,因为通常每个方面都定义了一个限制性规则,并且必须满足所有这些规则。)

^$不是XSD中的元字符:它们自己匹配。所以我看不出你的模式可能有效。 (除非该架构处理器是不符合的,可惜这种情况有时是这种情况)

由于您[a-zA-Z0-9...]类包括大部分西欧语系的,你可以考虑使用减法:[&#x20;-&#xff;-[exceptions]],其中的例外是字符的列表拉丁-1,你想排除。