正则表达式负向后视逃脱期/点

时间:2013-07-05 13:05:26

标签: java regex

如果在它之前找到转义字符,我一直在努力找出一个会转义"."的正则表达式模式。负面观察是有希望的,但我认为它不适用于".",如下面的语法

String test = "hostname.domain.com/abc/def/v1.8/ghi"

在上面的示例中,字符串需要按"."拆分,但我需要转义v1.8,以便v1和8不被视为URI部分中的不同数组元素。

String test = "hostname.domain.com/abc/def/v1\\.8/ghi"
test.split("(?!\\\\).");

预期输出{“hostname”,“domain”,“com / abc / def / v1.8 / ghi”}。 URI上下文路径不应该被“。”拆分。如果它带有任何“。”它只是代表版本。

上述负面的lookbehind语法适用于-之类的其他字符,但不适用于"."。我假设转义字符需要不同,但添加其他转义字符可能会导致进一步处理字符串时出现问题,因为输入是URI类型,并且不希望URI中的任何保留/特殊字符用作char来预先添加为了这。任何人的任何想法/帮助都表示赞赏。

4 个答案:

答案 0 :(得分:5)

为什么要使用正则表达式..使用URL

URL url=new URL(yourURL);
url.getPath();//abc/def/v1.8/ghi
url.getPort();//-1 in your case
url.getHost();//hostname.domain.com

您现在可以使用.

拆分主机名

答案 1 :(得分:3)

您可以使用此负前瞻性正则表达式:

(?!\\\\)(?:^|.)\\.

或使用负面观察:

(?<!\\\\)\\.

在线演示:http://www.rubular.com/r/Sqa2P7A6dRhttp://www.rubular.com/r/xgE7onrwzX

答案 2 :(得分:1)

为了避免在regex字符串中多次使用转义字符(Java编译器删除了一个转义级别;正则表达式引擎删除了另一级别),可以通过将它们括在方括号中来“转义”字符。例如,\\\\.将变得更具可读性[.]

在你的情况下,你可以告诉Java不要使用两位数之间的点,因为它是一个小数分隔符:

String test = "hostname.domain.com/abc/def/v1.8/ghi";
for (String s : test.split("(?<!\\d)[.](?!\\d)")) {
    System.out.println(s);
}

这是demo on ideone

答案 3 :(得分:1)

试试这个expr

 String[] s = "hostname.domain.com/abc/def/v1.8/ghi".split("(?<!/.{0,99})\\.");