据我所知,我很少使用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>
Run Code Online (Sandbox Code Playgroud)
您可以将 XSD 加载到 Java 中并提取表达式。然后,如果您要大量重用它们,则可以在.matches()方法中使用它们或创建对象。Pattern
首先,您需要将 XML 加载到 Java 程序中(我将其称为CodexSchema.xsd):
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document source = builder.parse(new File("CodexSchema.xsd"));
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用 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
Run Code Online (Sandbox Code Playgroud)
运行该表达式,您将得到org.xml.dom.NodeList包含<xs:pattern>元素的结果。
NodeList patternNodes = (NodeList)patternsXPath.evaluate(xPathRoot, source, XPathConstants.NODESET);
Run Code Online (Sandbox Code Playgroud)
现在您可以循环遍历它们并提取其属性的内容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;
}
Run Code Online (Sandbox Code Playgroud)
您实际上不需要将它们放入Pattern. 您可以简单地使用String.
您现在可以使用以下命令读取 Java 中的所有模式:
for(Pattern p : getPatterns(patternNodes)) {
System.out.println(p);
}
Run Code Online (Sandbox Code Playgroud)
以下是第三种模式的一些测试:
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`
Run Code Online (Sandbox Code Playgroud)