正则表达式匹配字符与两个字符的负后视
Regex match character with negative lookbehind of two chars
我想使用字符“/”拆分字符串,但只有在其前面没有“\”的情况下才会拆分。
字符串:
/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”,无法识别第一组的字符串“\/”。我不知道如何 optimize/change 我的正则表达式,以便它正确识别第一组。
你可以使用
(?:\/[^\\/]+){2}(?:\\/[^\\/]+)?
见regex demo。 详情:
(?:\/[^\\/]+){2}
- 两次出现
\/
- 一个 /
字符
[^\\/]+
- /
和 \
以外的一个或多个字符
(?:\\/[^\\/]+)?
- 可选出现:
\
- 一个 \
字符
\/
- 一个 /
字符
[^\\/]+
- /
和 \
以外的一个或多个字符
另一种选择是匹配 2 次正斜杠,并且只匹配前面有 \
的 /
(?:\/(?:[^\/]|(?<=\)\/)+){2}
说明
(?:
非捕获组
\/
匹配 /
(?:
非捕获组
[^\/]
匹配除 /
以外的任何字符
|
或
(?<=\)\/
匹配前面没有 \
的 /
)+
关闭组并重复 1 次以上以匹配除 /
之外的至少 1 个字符
){2}
关闭群重复2次
或者更高效的展开版本
(?:\/[^\\/]+(?:\.[^\\/]*)*){2}
说明
(?:
非捕获组
\/[^\\/]+
匹配 /
后跟除 \
和 /
以外的任何字符的 1+ 次
(?:
非捕获组
\.[^\\/]*
匹配转义字符后跟除 \
和 /
之外的任何字符 0+ 次
)*
关闭组并重复 0+ 次(如果没有出现转义字符)
){2}
关闭群重复2次
我想使用字符“/”拆分字符串,但只有在其前面没有“\”的情况下才会拆分。
字符串:
/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”,无法识别第一组的字符串“\/”。我不知道如何 optimize/change 我的正则表达式,以便它正确识别第一组。
你可以使用
(?:\/[^\\/]+){2}(?:\\/[^\\/]+)?
见regex demo。 详情:
(?:\/[^\\/]+){2}
- 两次出现\/
- 一个/
字符[^\\/]+
-/
和\
以外的一个或多个字符
(?:\\/[^\\/]+)?
- 可选出现:\
- 一个\
字符\/
- 一个/
字符[^\\/]+
-/
和\
以外的一个或多个字符
另一种选择是匹配 2 次正斜杠,并且只匹配前面有 \
/
(?:\/(?:[^\/]|(?<=\)\/)+){2}
说明
(?:
非捕获组\/
匹配/
(?:
非捕获组[^\/]
匹配除/
以外的任何字符
|
或(?<=\)\/
匹配前面没有\
的
/
)+
关闭组并重复 1 次以上以匹配除/
之外的至少 1 个字符
){2}
关闭群重复2次
或者更高效的展开版本
(?:\/[^\\/]+(?:\.[^\\/]*)*){2}
说明
(?:
非捕获组\/[^\\/]+
匹配/
后跟除\
和/
以外的任何字符的 1+ 次
(?:
非捕获组\.[^\\/]*
匹配转义字符后跟除\
和/
之外的任何字符 0+ 次
)*
关闭组并重复 0+ 次(如果没有出现转义字符)
){2}
关闭群重复2次