3

我一直在努力寻找一个正则表达式模式,"."如果在它之前找到一个转义字符,它就会逃逸。负向后看很有希望,但我认为它不适用于"."以下语法

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 上下文路径不应以“.”分隔。如果它带有任何“。” 它只是为了代表版本。

上面的否定后向语法适用于其他字符 like -,但不适用于".". 我假设转义字符需要不同,但添加其他转义字符可能会导致字符串的进一步处理出现问题,因为输入是 URI 类型并且不希望 URI 中的任何保留/特殊字符用作 char 前置为了这。感谢任何人的任何想法/帮助。

4

4 回答 4

4

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

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

或使用消极的后视:

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

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

于 2013-07-05T13:13:29.667 回答
4

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

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

您现在可以将主机名拆分为.

于 2013-07-05T13:14:26.437 回答
1

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

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

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

这是关于 ideone 的演示

于 2013-07-05T13:15:43.950 回答
1

试试这个表达式

 String[] s = "hostname.domain.com/abc/def/v1.8/ghi".split("(?<!/.{0,99})\\.");
于 2013-07-05T13:16:13.287 回答