Java 正则表达式转义周期/点的负查找

Java 正则表达式转义周期/点的负查找,java,regex,Java,Regex,我一直在努力寻找一个正则表达式模式,如果在它前面找到一个转义字符,它将转义“”。负lookback很有希望,但我认为它不适用于“,如下语法所示 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("(?

我一直在努力寻找一个正则表达式模式,如果在它前面找到一个转义字符,它将转义“”。负lookback很有希望,但我认为它不适用于
,如下语法所示

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("(?!\\\\).");
预期输出{“主机名”、“域”、“com/abc/def/v1.8/ghi”}。URI上下文路径不应该被“.”分割,如果它携带任何“.”,它将仅用于表示版本


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

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

(?!\\\\)(?:^|.)\\.
或使用负回溯:

(?<!\\\\)\\.
(?
在线演示:和

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


现在,您可以使用

拆分主机名,以避免在正则表达式字符串中多次使用转义字符(一个转义级别由Java编译器删除;另一个转义级别由正则表达式引擎删除)。可以“转义”将字符括在方括号中。例如,
\\\\.
将变得更可读

在您的例子中,您可以告诉Java不要使用两位数之间的点,因为它是十进制分隔符:

String test = "hostname.domain.com/abc/def/v1.8/ghi";
for (String s : test.split("(?<!\\d)[.](?!\\d)")) {
    System.out.println(s);
}
String test=“hostname.domain.com/abc/def/v1.8/ghi”;
对于(字符串s:test.split((?请尝试此表达式

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

String[]s=“hostname.domain.com/abc/def/v1.8/ghi”。split((?这种模式对您不起作用。
(?!\\\\\)
是一种负向前瞻,并且
没有转义,因此它匹配所有字符。那么,
“v1\\\.8/ghi”是什么呢
?这是一个真正的字符串吗?你会有
\。
?谢谢你的输入,但是即使输入是URI格式,它在流中也不会被解析为URI。逻辑会分割上下文路径并为restful URI创建服务名字符串。存储服务名的另一端不会将字符串解析为URI。谢谢你的帮助时间如何使用反向查找删除斜杠?例如,将
aaa.bbb\.ccc
拆分为
[aaa,bbb.ccc]
。拆分和替换是两种不同的操作,因此您可以按
(?但以后需要从生成的数组中替换反斜杠。如何使用负回溯忽略转义斜杠?例如,将
aaa.bbb\\.ccc
拆分为
[aaa,bbb\\\,ccc]
。我的意思是,仅当斜杠未转义时才忽略点。例如,将
aaa.bbb\.ccc
拆分为
[aaa,bbb\\,ccc]
aaa.bbb\.ccc
作为
[aaa,bbb\.ccc]
。检查此演示:
 String[] s = "hostname.domain.com/abc/def/v1.8/ghi".split("(?<!/.{0,99})\\.");