正则表达式匹配字符与两个字符的负后视

问题描述

我想使用字符“/”分割一个字符串,但只有在它前面没有“\”时才应该进行分割。

字符串:

/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

online regex example

问题出在第一组“/10/102-\/ABC083.013”上,它无法识别第一组的字符串“\/”。我不知道如何优化/更改我的正则表达式以使其正确识别第一组。

解决方法

另一种选择是匹配 2 次正斜杠,并且只匹配前面有 /\

(?:\/(?:[^\/]|(?<=\\)\/)+){2}

说明

  • (?: 非捕获组
    • \/ 匹配 /
    • (?: 非捕获组
      • [^\/] 匹配除 / 之外的任何字符
      • |
      • (?<=\\)\/ 匹配 / 前没有 \
    • )+ 关闭组并重复 1+ 次以匹配除 / 之外的至少 1 个字符
  • ){2} 关闭组并重复 2 次​​li>

Regex demo


或者更高效的展开版本

(?:\/[^\\\/]+(?:\\.[^\\\/]*)*){2}

说明

  • (?: 非捕获组
    • \/[^\\\/]+ 匹配 / 后跟 1+ 次除 \/ 以外的任何字符
    • (?: 非捕获组
      • \\.[^\\\/]* 匹配转义字符后跟除 \/ 之外的任何字符的 0 倍以上
    • )* 关闭组并重复 0 次以上(以防出现转义字符)
  • ){2} 关闭组并重复 2 次​​li>

Regex demo

,

你可以使用

(?:\/[^\\\/]+){2}(?:\\\/[^\\\/]+)?

参见regex demo详情

  • (?:\/[^\\\/]+){2} - 出现两次
    • \/ - / 字符
    • [^\\\/]+ - 除 /\ 之外的一个或多个字符
  • (?:\\\/[^\\\/]+)? - 可选出现:
    • \\ - \ 字符
    • \/ - / 字符
    • [^\\\/]+ - 除 /\ 之外的一个或多个字符