【问题标题】:Regex match character with negative lookbehind of two chars正则表达式匹配字符与两个字符后面的负数
【发布时间】:2021-04-16 06:11:15
【问题描述】:

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

字符串:

/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”上,它无法将字符串“\/”识别到第一组。我不知道如何优化/更改我的正则表达式,以便正确识别第一组。

【问题讨论】:

    标签: regex negative-lookbehind


    【解决方案1】:

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

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

    说明

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

    Regex demo


    或者更高效的展开版本

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

    说明

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

    Regex demo

    【讨论】:

      【解决方案2】:

      你可以使用

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

      请参阅regex demo详情

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

      【讨论】:

      • 效果很好。使用 {2} 我也尝试过,但显然是错误的。非常感谢!
      • @Maisen1886 (?:\/[^\\\/]+){2} 等于 \/[^\\\/]+\/[^\\\/]+。模式序列的重复应使用非捕获组(如果支持)定义,(?:...)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2022-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多