这个问题在这里已有答案:
- Java中的正则表达式命名组 6个答案
8122
2018-06-22 17:21
起源
关于java =最讨厌的事情之一 - Falmarri
答案:
这从开始支持 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。)
16
2018-06-22 17:25
谢谢你的快速回复。不幸的是,我们仍在使用Java 6.也许我只是创建一个枚举:String foo = matcher.group(MyGroups.FOO); - aelstonjones
看看 命名正则表达式 项目。它的具体目的是提供一种在Java7之前处理命名组的方法。 - matts
更新后的分叉 named-regexp 是优选的。 - tony19
请注意,命名组仅在调用后才起作用 matcher.matches() - bcoughlan
@bcoughlan啊,对,你。谢谢你指出来。我更新了答案,包括这个,虽然我用过 Matcher#find() 因为它与C#匹配 Regex#Match() 方法更类似于 Matcher#matches()。 - matts
Java v1.7现在支持Perl标准命名组 (?<name>...)
和 \k<name>
在模式中。
您不能在同一模式中使用重复的组名称,这可能会在非常复杂的情况下令人烦恼,在这种情况下,您正在从控制之外的较小部分构建较大的模式。它也缺乏相对索引。
但是,对于你似乎在写作的简单事情来说应该足够了。
2
2018-06-22 17:27
我相信你需要进口
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])$");
}
-2
2018-06-22 17:23
可能误解了这个问题。重新阅读它,现在这看起来不像你想要的。不知道你的意思是“抢团” - owen gerig
基本上,我想要一种干净的方法从组数组中获取匹配的模式,而不使用索引号而是使用名称。 - aelstonjones