在XSD中拆分正则表达式模式限制
问题描述:
我的XSD中有一个正则表达式模式,但可读性很差。在XSD中拆分正则表达式模式限制
<xs:element name="short_description">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="|^([a-zA-Z0-9áÁâÂàÀäÄåÅöÖòÒóÓôÔøØüÜûÛùÙúÚßíÍïÏîÎìÌñÑÇç.,?()!\/çéÉêÊèÈëË +;&'':"\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="|^([&$apos;"]){1,}$"/>
<xs:pattern value="|^([\n\t]){1,}$"/>
<xs:pattern value="|^([%#£°€@=«»¦*]){1,}$"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
重新运行我的XSD似乎他只是在看第一线的时候,图案被分开后。
有没有办法让第一个模式(见上面)更具可读性?或者我在第二个例子中做错了什么?
答
您可以使用multiple patterns,但它们之间的关系是OR,而不是AND:
包含不止一个
<pattern>
元素的XML<restriction>
产生了一个单·正则表达式·中集;这个正则表达式是正则表达式的“或”,它是<pattern>
元素的内容。
如果你有[A-Za-z]+
然后[0-9]+
,这意味着你允许值,仅由1个或多个字母(第一个)或1+数字(第二)。这并不意味着你允许一个由一个或多个字母或数字组成的字符串。
正是在这种情况下,更安全的写模式作为一个单一的限制:
<xs:pattern value="([a-zA-Z0-9áÁâÂàÀäÄåÅöÖòÒóÓôÔøØüÜûÛùÙúÚßíÍïÏîÎìÌñÑÇç.,?()!/çéÉêÊèÈëË +;&':"\n\t%#£°€@=«»¦*`´-]+)?" />
需要注意的是:
- 要可选模式(即允许空匹配)更安全以封闭带有可选组整个图案(
(<PATTERN>)?
) -
$apos;
应'
- XML模式的正则表达式ps默认为锚定,
^
和$
不应该使用 - 要支持Unicode字母,您可以考虑只使用
\p{L}
Unicode类别类。
答
在@WiktorStribiżew的帮助下,我找到了答案。
- 这是不可能在这样的XSD拆分正则表达式,我使用它
- 正则表达式也提高了 - '>
([a-zA-Z0-9áÁâÂàÀäÄåÅöÖòÒóÓôÔøØüÜûÛùÙúÚßíÍïÏîÎìÌñÑÇç.,?()!/çéÉêÊèÈëË +;&':"\n\t%#£$°€@=«»¦*
- ] +)`
? - >此正则表达式允许1到人物众多
- >它还允许空标签
答
它允许有多个模式方面:如果你这样做,必须输入他们中的任何一个相匹配。 (这有点违反直觉,因为通常每个方面都定义了一个限制性规则,并且必须满足所有这些规则。)
^
和$
不是XSD中的元字符:它们自己匹配。所以我看不出你的模式可能有效。 (除非该架构处理器是不符合的,可惜这种情况有时是这种情况)
由于您[a-zA-Z0-9...]
类包括大部分西欧语系的,你可以考虑使用减法:[ -ÿ-[exceptions]]
,其中的例外是字符的列表拉丁-1,你想排除。
你确定你的模式有效吗?第一个应该做的是什么? '''''''''代表什么?你的意思是'''?看起来你需要使用1个正则表达式,['] [a-zA-Z0-9áÁüâÃÂÃÂÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃÃà '' - ] +“'](https://regex101.com/r/GiXSXy/1),因为将它分成单独的不一样。 –
是的,他们的工作,事实上,它必须是'。 但是,也许我们应该忽略这个问题,如果它的工作与否;)使它更一般。如果你有这样一个正则表达式,你能把它分成多行吗? – Dragonix
你不能把'[^ a-z0-9]'分割成'[^ a-z] | [^ 0-9]'。它打破了整个功能并匹配任何字符。 –