代码之家  ›  专栏  ›  技术社区  ›  Jordan Lewallen

如何在使用regex之后从带有可选字符串的字符串中提取字符?

  •  1
  • Jordan Lewallen  · 技术社区  · 6 年前

    我在学习regex的过程中遇到了这个问题。我有一个网址可以在两个州 EXAMPLE 1 :

    spotify.com/track/1HYcYZCOpaLjg51qUg8ilA?si=Nf5w1q9MTKu3zG_CJ83RWA
    

    或者 EXAMPLE 2 以下内容:

    spotify.com/track/1HYcYZCOpaLjg51qUg8ilA
    

    我需要提取 1HYcYZCOpaLjg51qUg8ilA 身份证件

    到目前为止,我使用这个: (?<=track\/)(.*)(?=\?)? 在例2中它工作得很好,但是它包括 ?si=Nf5w1q9MTKu3zG_CJ83RWA 当与例1匹配时。

    但如果我移除 ? 在表达式的末尾,它适用于示例1,但不适用于示例2!不是说最后一组 (?=\?) 是可选的,应该匹配吗?

    我哪里做错了?

    谢谢!

    我搜索了一些“可能已经有你的答案的问题”的建议,所以没有找到这个案例,所以我希望问这个是好的!

    3 回复  |  直到 6 年前
        1
  •  2
  •   Paolo    6 年前

    正则表达式中的捕获组正在尝试匹配任何( . )因为量词的贪婪( * )

    使用时:

    • (?<=track\/)(.*)(?=\?)

    只有 1HYcYZCOpaLjg51qUg8ilA 从第一个例子中捕获,因为在第二个例子中没有问号。

    使用时:

    • (?<=track\/)(.*)(?=\??)

    您有效地使正向展望成为可选的,因此捕获组将尝试尽可能多地匹配(包括问号),以便 1HYcYZCOpaLjg51qUg8ilA?si=Nf5w1q9MTKu3zG_CJ83RWA 1hycyzcopaljg51qug8ila公司 匹配,这不是所需的输出。

    与其匹配任何东西,不如匹配字母数字字符 \w 只有。

    • (?<=track\/)(\w*)(?=\??)

    或者,如果您希望使用其他字符,可以使用连字符 - 或下划线 _ ,可以使用字符类。

    • (?<=track\/)([a-zA-Z0-9_-]*)(?=\??)

    或者你想抓住一切 除了 问号 ? 一个否定的字符类。

    • (?<=track\/)([^?]*)(?=\??)

    正如加甘索所指出的,在这种情况下(或者实际上是在展望未来)不需要回头看,但是开始和他们玩确实是个好主意。环视断言实际上并不使用字符串中的字符。如你所见 here ,两个匹配项的完全匹配仅包含捕获组捕获的内容。你可以找到更多的信息 here 是的。

        2
  •  2
  •   gaganso    6 年前

    这应该有效:

     track\/(\w+)
    

    请看 here 是的。

    由于track是这两个字符串的一部分,并且id是由字母数字字符构成的,因此上面的regex与字符串“track/”匹配并捕获该字符串之后的字母数字字符,应该提供所需的id。

        3
  •  0
  •   samizzy    6 年前

    正则表达式: (\w+(?=\?))|(\w+&) 查看regex的演示, https://regexr.com/3s4gv 是的。 这将首先尝试搜索具有“?”的单词。就在它之后,如果那不成功,它将得到最后一个字。