我有正则表达式在文本中找到网址:
^(?!:\/\/)([a-zA-Z0-9-_]+\.)*[a-zA-Z0-9][a-zA-Z0-9-_]+\.[a-zA-Z]{2,11}?$
但是当它被文本包围时失败:
https://regex101.com/r/0vZy6h/1
我似乎无法理解为什么它不起作用。
答案 0 :(得分:1)
模式不起作用的可能原因:
^
和$
使其与整个字符串相匹配 (?!:\/\/)
是一个否定的预测,如果在当前位置的右侧有://
子字符串,则匹配失败。但[a-zA-Z0-9-_]+
表示不能有任何://
,因此,如果 left 存在://
,则您很可能希望失败。当前位置,即您想要负面的背后隐藏,(?<!:\/\/)
。[a-zA-Z]{2,11}?
- 仅在$
被删除后才会匹配2个字符,因为{2,11}?
是 lazy 量词,并且此类模式位于结尾处模式它总是匹配最小的char数量,这里,2。使用
(?<!:\/\/)([a-zA-Z0-9-_]+\.)*[a-zA-Z0-9][a-zA-Z0-9-_]+\.[a-zA-Z]{2,11}
请参阅regex demo。如果您需要将子字符串作为整个单词匹配,请添加\b
字边界。
请注意,在Python正则表达式中无需转义/
,您可以将(?<!:\/\/)
替换为(?<!://)
。
答案 1 :(得分:0)
空格不匹配。尝试在字符集中添加空格,检查前导或尾随文本。