2015-10-19 148 views
1

我需要从完全限定的域名字符串中获取主机名。 所有家长站点/子/接口名称应该被剥夺,即Java正则表达式 - 多个替换

abc001 -> abc001  ## stays name ## 
efg.fqdn.com -> efg ## only 1st/short name ## 
mnop-int -> mnop  ## only 1st/short name ## 
help-adm.fqdn -> help ## only 1st/short name ## 

我已经试过类似这样的各种组合:

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

,但它并没有太大的帮助。

PS:正则表达式应该是一个单线程,因为它是作为应用程序的输入。

+1

...和问题? –

+0

你不觉得** help-adm **和** mnop-int **应该是答案的一部分。即mnop-int.subdomain.domin – Manoj

+0

@Manoj,不完全...如果服务器可以通过不同的接口解析,比如server-int或server-adm,我们必须删除'-int'或'-adm'从它的名字。 – Marcos

回答

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 
+0

是的你的理解是正确的,但是当我运行正则表达式时,它显示所有分隔值作为输出,而不是仅仅第一个分隔值。 – Marcos

+0

@Marcos我刚刚在我的答案中重新运行示例代码,并且工作正常。 – Tunaki

1

正则表达式的味道比Java的

^.*?\\b

您可以\bword boundary here.See演示等。

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

字边界\b不会在这种情况下工作,如Java包括所有Unicode字符范围为单词边界条件。

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_]
如果你得到的字符串是由这些字符的,你的罚款。