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

时间:2017-05-23 01:55:05

标签: regex regex-negation regex-lookarounds

我正在尝试提取网址字符串的特定部分。一个简化的示例是在网址中查找以“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个字符情景中的/,但在?情况和匹配位于字符串末尾的情况下失败。

有没有更简单的方法来实现这个目标?

2 个答案:

答案 0 :(得分:1)

我建议使用

\.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个字符。

答案 1 :(得分:0)

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

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

<强>解释

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

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

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

<强> Regex101 Demo