如何在java正则表达式中转换xsd:pattern

时间:2014-04-22 12:12:16

标签: java regex xsd

据我所知,我使用了很少的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>

1 个答案:

答案 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`