Java正则表达式 - 多次替换

时间:2015-10-19 11:46:22

标签: java regex

我需要从完全限定的域名String中获取主机名。 应剥离所有父域/子域/接口名称,即

(.*?)(?:.|-)

我尝试了类似的各种组合:

jArray.getJSONObject(0);

但它没有多大帮助。

PS:正则表达式应该是单行代码,因为它在应用程序中作为输入。

3 个答案:

答案 0 :(得分:1)

除了Java之外的正则表达式 -

^.*?\\b

您可以在这里\bword boundary。参见演示。

https://regex101.com/r/tD0dU9/3

字边界\b在这种情况下不起作用,因为Java包括所有unicode字符范围作为字边界条件。

答案 1 :(得分:1)

如果我理解你的要求是正确的,你想在第一个点或连字符之前得到一个字符串的一部分。

在这种情况下,以下正则表达式将起作用:"([^.-]*)[.-]?"。第一个匹配将是所需的字符串。

测试代码:

public static void main(String[] args) throws Exception {
    String[] strs = { "abc001", "efg.fqdn.com", "mnop-int", "help-adm.fqdn" };
    Pattern pattern = Pattern.compile("([^.-]*)[.-]?");
    for (String str : strs) {
        Matcher matcher = pattern.matcher(str);
        if (matcher.find()) {
            System.out.println(matcher.group(1));
        }
    }
}

输出:

abc001
efg
mnop
help

答案 2 :(得分:0)

由于Java的\b边界条件与其他正则表达式引擎略有不同,我们在使用边界条件时需要更加小心。

public class BoundaryCondRegEx {

 public static void main(String[] args) {

    Pattern p = Pattern.compile("^(?<n>\\w+).*$");
    Matcher m = p.matcher("mnop-int");
    if(m.matches())
    {
        System.out.print(m.group("n"));
    }
    else
        System.out.println("Nope");

   }

}

所以正如模式"^(?<n>\\w+).*$"中所提到的,\w代表[0-9A-Za-z_],如果你的结果子串是由这些字符组成的,你就可以了