代码之家  ›  专栏  ›  技术社区  ›  opensas

与基路径匹配的正则表达式

  •  0
  • opensas  · 技术社区  · 6 年前

    我试图用一个正则表达式来匹配某个基路径。规则应该与基路径本身加上“/”或“.”和路径的其余部分匹配。

    例如,给定/api/ping,以下内容应该匹配

    /api/ping.json
    /api/ping
    /api/ping/xxx/sss.json
    /api/ping.xml
    

    这个不应该匹配

    /api/pingpong
    /api/ping_pong
    /api/ping-pong
    

    我尝试了以下regexp:

    /api/ping[[\.|\/].*]?
    

    但它似乎没有抓住 /api/ping 案例

    这是A link 至Regex暴风测试仪

    ——

    更新:多亏了这些答案,现在我有了更好地反映我的推理的版本:

    \/api\/ping(?:$|[.\/?]\S*)
    

    表达式要么在ping之后结束(即 $ 部分)或继续 . , / ? 后跟任何非空格字符

    这里是 regex

    2 回复  |  直到 6 年前
        1
  •  4
  •   Pushpesh Kumar Rajwanshi    6 年前

    您可以使用此regex,它使用交替来确保基路径后面紧跟 . / 或结束线 $

    \/api\/ping(?=\.|\/|$)\S*
    

    说明:

    • \/api\/ping 火柴 /api/ping 字面上的文字
    • (?=\.|\/|$) -向前看,确保下面的内容不是一个文本点 . 或斜线 / 或结束线 $
    • \S* -可选地跟随路径后面的任何非空格字符

    Demo

    在你的正则表达式中, /api/ping[[\.|\/].*]? 字符集的使用 [] 不正确,不需要转义点 . 交替 | 在字符集中不需要,并且不能通过放置 γ 在character类中,而且由于character类看起来是嵌套的,所以它不是必需的,也不是正确的操作。我猜你想把你的瑞格鞋做成这样,

    \/api\/ping([.\/].*)?$
    

    Demo with your corrected regex

    注意,一旦你把东西放进去 [] 然后,它只算作一个字符,允许在字符集中包含所有内容,因此它允许一个点 . 或斜线 / 注意到你需要逃跑 / 作为 \/

        2
  •  1
  •   The fourth bird    6 年前

    你的模式使用 character class 这将匹配任何列出的,也可以写为 [[./|] .

    它不匹配 /api/ping 因为character类必须至少匹配1次,因为它不是可选的。

    你可以用一个 alternation 相配 /API/ping 然后断言字符串的结尾或 | 通过重复0次或更多次匹配正斜杠,后面不是正斜杠,后面是点和1+次,然后是点和扩展名来匹配结构。

    /api/ping(?:(?:/[^/\s]+)*\.\S+|$)
    

    那将匹配

    • /API/ping 字面上的匹配
    • (?: 非捕获组
      • (?:/[^/\s]+)* 重复分组结构0+次匹配 / 那么1倍以上不是 / 或空白字符
      • \.\S+ 匹配一个点和一个非空白字符的1+倍
      • γ
      • $ 断言字符串的结尾
    • ) 关闭非捕获组

    regex demo γ C# demo