Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 模式验证中的正则表达式_Java_Regex_Xml_Validation_Xsd - Fatal编程技术网

Java 模式验证中的正则表达式

Java 模式验证中的正则表达式,java,regex,xml,validation,xsd,Java,Regex,Xml,Validation,Xsd,我需要一个xml模式,它验证一个空节点和一个8位为true的节点。因此,我使用以下简单类型定义了一个XML模式: <xs:simpleType name="LeererStringOder8Zeichen"> <xs:restriction base="xs:string"> <xs:pattern value="(^$|\d{8})"/> </xs:restriction> </xs:simpleType&g

我需要一个xml模式,它验证一个空节点和一个8位为true的节点。因此,我使用以下简单类型定义了一个XML模式:

<xs:simpleType name="LeererStringOder8Zeichen">
    <xs:restriction base="xs:string">
        <xs:pattern value="(^$|\d{8})"/>
    </xs:restriction>
</xs:simpleType>

我使用java.util.regex和Xerces的内部RegularExpression类尝试了这个正则表达式。两者都返回了真值。但是,当我在WS中使用这个simpleType(使用CXF实现)时,当我提交一个空字符串(例如)时,会出现一个验证错误。为什么?有人知道如何改变我的模式,让它接受一个空标记和一个包含8位数字的标记吗

谢谢你的帮助, Andreas

这将起作用:

<xs:simpleType name="LeererStringOder8Zeichen">
    <xs:restriction base="xs:string">
        <xs:pattern value="|\d{8}"/>
    </xs:restriction>
</xs:simpleType>

|\d{8}
表示不匹配或八位数字。(您也可以使用
|[0-9]{8}

似乎
(^$|\d{8})
(尽管我认为你的意思是
^(^$\d{8})$
)不起作用的原因是:

特别值得注意的是,完全没有插入符号和美元、单词边界和环视等锚点。XML模式始终隐式地锚定整个正则表达式。正则表达式必须与整个元素匹配,才能将元素视为有效元素


因此,您的锚定显然导致正则表达式无法按预期运行。

正如@dbank指出的,XSD中的正则表达式是隐式锚定的,$和^符号不能识别为元字符。然而,一些XSD“实现”(所谓的)忽略了这里的规范,只是将所有正则表达式处理委托给一些不知道XSD规则的底层库

对于匹配零长度字符串或正好匹配8位数字的正则表达式,我自己的选择是
(\d{8})?