如果在它之前找到转义字符,我一直在努力找出一个会转义"."
的正则表达式模式。负面观察是有希望的,但我认为它不适用于"."
,如下面的语法
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来预先添加为了这。任何人的任何想法/帮助都表示赞赏。
答案 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)
您可以使用此负前瞻性正则表达式:
(?!\\\\)(?:^|.)\\.
或使用负面观察:
(?<!\\\\)\\.
答案 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);
}
答案 3 :(得分:1)
试试这个expr
String[] s = "hostname.domain.com/abc/def/v1.8/ghi".split("(?<!/.{0,99})\\.");