【发布时间】:2019-12-14 16:21:54
【问题描述】:
我正在尝试使用正则表达式验证受限字符串...
<xs:simpleType name="myStringType">
<xs:restriction base="xs:string">
<xs:pattern value="^urn:mystuff:v1:(ABC\.(?!Acme).\S+\.\S+\.a\d+\.v\d+|ABC\.Acme\.\S+\.a\d+\.\d+\.\d+)$"/>
</xs:restriction>
</xs:simpleType>
如您所见,我尝试使用的正则表达式是
^urn:mystuff:v1:(ABC\.(?!Acme).\S+\.\S+\.a\d+\.v\d+|ABC\.Acme\.\S+\.a\d+\.\d+\.\d+)$
我想验证以下内容:
urn:mystuff:v1:ABC.Test.MyData.a1.v1
urn:mystuff:v1:ABC.Acme.MyData.a1.0.1
但我希望以下失败
urn:mystuff:v1:ABC.Acme.MyData.a1.v1
这在online regex tester 中似乎可以正常工作,但是当我使用 Oxygen XML 编辑器时出现以下错误。
Pattern value '^urn:mystuff:v1:(ABC\.(?!Acme).\S+\.\S+\.a\d+\.v\d+|ABC\.Acme\.\S+\.a\d+\.\d+\.\d+)$' is not a valid regular expression. The reported error was: 'This expression is not supported in the current option setting.'.
This post 建议 XSD 正则表达式不支持前瞻和后瞻,但问题与数字模式有关,因此在示例中采用了蛮力方法。这是可能的,因为可能性的子集非常有限。
当要禁止的值是特定字符串时,如何处理?
【问题讨论】:
-
为了澄清一点,这个序列中的点
(?!Acme).\S+是文字还是元字符?或者,这是一个不应该出现的错字吗? -
文字。示例如此模式
-
@x15 你删除了你的答案吗?
-
这个与正则表达式有关的具体问题非常复杂。我什至不喜欢去想它,虽然我有很多次。我认为自己是专家。这个问题正好有解决办法。
-
同意。其他问题有一些有用的花絮,但并没有真正为这个问题提供一个可行的答案,因为它有自己独特的挑战。