12

我想知道 Java 是否有等效于 C# 的命名模式匹配。例如,在 C# 中,我可以执行以下操作:

var pattern = @";(?<foo>\d{6});(?<bar>\d{6});";
var regex = new Regex(pattern , RegexOptions.None);
var match = regex.Match(";123456;123456;");

var foo = match.Groups["foo"].Success ? match.Groups["foo"].Value : null;
var bar = match.Groups["bar"].Success ? match.Groups["bar"].Value : null;

这似乎是一种吸引群体的干净方式。Java可以做类似的事情,还是我需要根据索引位置抓取组?

String foo = matcher.group(0);
4

3 回答 3

19

从Java 7开始支持此功能。你的 C# 代码可以翻译成这样的:

String pattern = ";(?<foo>\\d{6});(?<bar>\\d{6});";
Pattern regex = Pattern.compile(pattern);
Matcher matcher = regex.matcher(";123456;123456;");
boolean success = matcher.find();

String foo = success ? matcher.group("foo") : null;
String bar = success ? matcher.group("bar") : null;

您必须创建一个Matcher在您调用find().

(我使用find()它是因为它可以在输入字符串的任何位置找到匹配项,就像Regex.Match()方法一样。.matches()只有当正则表达式匹配整个输入字符串时,该方法才返回 true。)

于 2012-06-22T17:25:32.687 回答
2

Java v1.7 现在支持 Perl 标准的命名组,例如(?<name>...)\k<name>模式。

您不能在同一模式中有重复的组名,这在非常复杂的情况下可能会很烦人,因为您正在从无法控制的较小部分构建较大的模式。它也缺乏相对索引。

但是,对于您似乎正在编写的这些简单的事情,这应该足够了。

于 2012-06-22T17:27:20.503 回答
-2

我相信你需要进口

org.apache.commons.lang3.StringUtils;

为了这

 private Boolean validateEmail(String email)
    {
        return email.matches("^[-!#$%&'*+/0-9=?A-Z^_a-z{|}~](\\.?[-!#$%&'*+/0-9=?A-Z^_a-z{|}~])*@[a-zA-Z](-?[a-zA-Z0-9])*(\\.[a-zA-Z](-?[a-zA-Z0-9])*)+$");
    }

    private Boolean validateIP(String IP)
    {
        return IP.matches("^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$");
    }

    private Boolean validateHostname(String Hostname)
    {
        return Hostname.matches("^(([a-zA-Z]|[a-zA-Z][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\\-]*[A-Za-z0-9])$");
    }
于 2012-06-22T17:23:30.360 回答