据我所知,我使用了很少的java正则表达式,有一种方法(或工具)来转换java正则表达式中的控件xsd:pattern?
我的xsd:模式如下:
<xsd:simpleType name="myCodex">
<xsd:restriction base="xsd:string">
<xsd:pattern value="[A-Za-z]{6}[0-9]{2}[A-Za-z]{1}[0-9]{2}[A-Za-z]{1}[0-9A-Za-z]{3}[A-Za-z]{1}" />
<xsd:pattern value="[A-Za-z]{6}[0-9LMNPQRSTUV]{2}[A-Za-z]{1}[0-9LMNPQRSTUV]{2}[A-Za-z]{1}[0-9LMNPQRSTUV]{3}[A-Za-z]{1}" />
<xsd:pattern value="[0-9]{11,11}" />
</xsd:restriction>
</xsd:simpleType>
答案 0 :(得分:1)
您可以将XSD加载到Java中并提取表达式。然后,您可以在.matches()
方法中使用它们,或者如果要重复使用它们,则可以创建Pattern
个对象。
首先,您需要将XML加载到Java程序中(我称之为CodexSchema.xsd
):
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document source = builder.parse(new File("CodexSchema.xsd"));
然后,您可以使用XPath查找要提取的模式(如果要处理多个模式,可能需要创建一个采用简单类型名称的方法)。我使用了一个更复杂的XPath表达式来避免注册名称空间:
XPathFactory xPathfactory = XPathFactory.newInstance();
String typeName = "myCodex";
String xPathRoot = "//*[local-name()='simpleType'][@name='"+typeName+"']/*[local-name()='restriction']/*[local-name()='pattern']";
XPath patternsXPath = xPathfactory.newXPath(); // this represents the NodeList of <xs:pattern> elements
运行该表达式,您会得到包含org.xml.dom.NodeList
元素的<xs:pattern>
。
NodeList patternNodes = (NodeList)patternsXPath.evaluate(xPathRoot, source, XPathConstants.NODESET);
现在,您可以遍历它们并提取其value
属性的内容。您可能想为此编写一个方法:
public List<Pattern> getPatterns(NodeList patternNodes) {
List<Pattern> expressions = new ArrayList<>();
for(int i = 0; i < patternNodes.getLength(); i++) {
Element patternNode = (Element)patternNodes.item(i);
String regex = patternNode.getAttribute("value");
expressions.add(Pattern.compile(regex));
}
return expressions;
}
你真的不需要把它们放进Pattern
。您只需使用String
。
您现在可以使用以下方式阅读Java中的所有模式:
for(Pattern p : getPatterns(patternNodes)) {
System.out.println(p);
}
以下是第三种模式的一些测试:
Pattern pattern3 = getPatterns(patternNodes).get(2);
Matcher matcher = pattern3.matcher("47385628403");
System.out.println("test1: " + matcher.find()); // prints `test1: true`
System.out.println("test2: " + "47385628403".matches(pattern3.toString())); // prints `test2: true`