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

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

online regex example

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

你可以使用

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

regex demo详情:

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

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

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

说明

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

Regex demo


或者更高效的展开版本

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

说明

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

Regex demo