具有字符限制、特定起始字符和终止符的字符串的正则表达式匹配

regex matching for string with character limit, specific start characters, and termination

我正在尝试提取 url 字符串的特定部分。一个简化的示例是在 url 中查找以 "who" 或 "what" 开头的任何字符串,总长度为 5 或 10 个字符,并停止匹配任何非字母数字字符串

例如:

http://www.test.com/who12/foo -> who12 //5 个字符匹配以 who 开始并在 /

结束

http://www.test.com/who1234567/foo -> who1234567 //10 个字符匹配,从 who 开始到 /

结束

http://www.test.com/what1 -> what1 //匹配字符串末尾的5个字符

http://www.test.com/what1?param=true -> what1 //5 个字符匹配在 ?

处中断

我试过设置一些东西 here

它在 5 和 10 个字符的情况下在 / 上中断,但在 ? 情况下以及匹配位于字符串末尾的情况下失败。

是否有更简单的方法来完成此操作?

尝试使用以下正则表达式。

正则表达式: (?=.{5,10})(?:who|what)(?:[^\/?\s]*)

解释:

  • (?=.{5,10}) 前瞻检查字符串的长度是否为 5 到 10 个字符。

  • (?:who|what) 匹配文字 whowhat.

  • [^\/?\s]*/?\s (whitespace) 的否定字符 class。因此将匹配除这些之外的其他字符。

Regex101 Demo

我建议使用

\.com\/\K(?:who[^\/?\s]{2}|what[^\/?\s])(?:[^\/?\s]{5})?

参见 this regex demo

如果不支持 PCRE \K 匹配重置运算符,请使用捕获方法:

\.com\/((?:who[^\/?\s]{2}|what[^\/?\s])(?:[^\/?\s]{5})?)

this regex demo

详情:

  • \.com\/ - 匹配 .com/ 以便为您需要的文本找到必要的左侧上下文
  • (?:who[^\/?\s]{2}|what[^\/?\s])(?:[^\/?\s]{5})? - 两个备选方案和可选的 5 个字符后的任意一个:
    • who[^\/?\s]{2} - who 后跟 /? 和空格
    • 以外的 2 个字符
    • | - 或
    • what[^\/?\s] - what 后跟 /? 和空格以外的 1 个字符,然后是...
  • (?:[^\/?\s]{5})? - 可选/? 和空格外的 5 个字符。