问题描述
我想使用字符“/”分割一个字符串,但只有在它前面没有“\”时才应该进行分割。
字符串:
/10/102-\/ABC083.013/11/201201/20/83/30/463098194/32/7.7/40/0:20
正则表达式:
\/*(?<!\\)[^\/]*\/*(?<!\\)[^\/]*
预期结果:
/10/102-\/ABC083.013
/11/201201
/20/83
/30/463098194
/32/7.7
/40/0:20
但是使用我的正则表达式我得到:
/10/102-\
/ABC083.013/11
/201201/20
/83/30
/463098194/32
/7.7/40
/0:20
问题出在第一组“/10/102-\/ABC083.013”上,它无法识别第一组的字符串“\/”。我不知道如何优化/更改我的正则表达式以使其正确识别第一组。
解决方法
另一种选择是匹配 2 次正斜杠,并且只匹配前面有 /
的 \
(?:\/(?:[^\/]|(?<=\\)\/)+){2}
说明
-
(?:
非捕获组-
\/
匹配/
-
(?:
非捕获组-
[^\/]
匹配除/
之外的任何字符 -
|
或 -
(?<=\\)\/
匹配/
前没有\
-
-
)+
关闭组并重复 1+ 次以匹配除/
之外的至少 1 个字符
-
-
){2}
关闭组并重复 2 次li>
或者更高效的展开版本
(?:\/[^\\\/]+(?:\\.[^\\\/]*)*){2}
说明
-
(?:
非捕获组-
\/[^\\\/]+
匹配/
后跟 1+ 次除\
和/
以外的任何字符 -
(?:
非捕获组-
\\.[^\\\/]*
匹配转义字符后跟除\
和/
之外的任何字符的 0 倍以上
-
-
)*
关闭组并重复 0 次以上(以防出现转义字符)
-
-
){2}
关闭组并重复 2 次li>
你可以使用
(?:\/[^\\\/]+){2}(?:\\\/[^\\\/]+)?
参见regex demo。 详情:
-
(?:\/[^\\\/]+){2}
- 出现两次-
\/
-/
字符 -
[^\\\/]+
- 除/
和\
之外的一个或多个字符
-
-
(?:\\\/[^\\\/]+)?
- 可选出现:-
\\
-\
字符 -
\/
-/
字符 -
[^\\\/]+
- 除/
和\
之外的一个或多个字符
-