我正在尝试提取网址字符串的特定部分。一个简化的示例是在网址中查找以“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
//在?
我尝试过设置一些东西 here
它打破了5和10个字符情景中的/,但在?
情况和匹配位于字符串末尾的情况下失败。
有没有更简单的方法来实现这个目标?
答案 0 :(得分:1)
我建议使用
\.com\/\K(?:who[^\/?\s]{2}|what[^\/?\s])(?:[^\/?\s]{5})?
请参阅this regex demo。
如果不支持PCRE \K
匹配重置运算符,请使用捕获方法:
\.com\/((?:who[^\/?\s]{2}|what[^\/?\s])(?:[^\/?\s]{5})?)
<强>详情:
\.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)
匹配文字who
或what
。
[^\/?\s]*
是/
,?
,\s (whitespace)
的否定字符类。因此,除了这些之外的其他角色将被匹配。
<强> Regex101 Demo 强>