如何在javaregex中转换xsd:pattern



正如我所知,而且我很少使用java regex,有一种方法(或工具)可以在java regex中转换控件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>

您可以将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

运行该表达式可以得到包含<xs:pattern>元素的org.xml.dom.NodeList

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`

最新更新