regex - 如果以特定子字符串开头,则正则表达式忽略字符串
问题描述
我需要查找不以字符串“http”开头的正则表达式域名。例如:
- https://domain1.com -> 不匹配
- http://domain2.com -> 不匹配
- domain3.com -> 匹配
- domain4.co.uk -> 匹配
我找到了一个几乎得到这个的正则表达式:
(?:[a-zA-Z0-9](?:[a-zA-Z0-9\-]{,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}
但它也检测到“https://domain1.com”
给出的例子:
https://regex101.com/r/DjDBrx/1/
在这个例子中,我想避免“https://domain1.com”
任何帮助将不胜感激。
解决方案
您可以使用单词边界和两个否定的lookbehinds:
\b(?<!http:\/\/)(?<!https:\/\/)(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]{,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}\b
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^
这(?<!http:\/\/)(?<!https:\/\/)
两个负面的lookbehinds将在字符串内的同一位置触发(因为lookarounds是非消耗模式)并且 - 在确保该位置位于单词边界之后\b
- 如果存在http://
或https://
立即匹配,它们将失败当前位置的左侧。
推荐阅读
- ruby - 从字符串中获取时间(以秒为单位)并添加到当前时间?
- influxdb - influxdb 查询 5 个最高 cpu 使用率
- c# - MVC + WebApi。授权和认证
- encryption - javacardx AES 加密不等于 javax AES 解密
- mysql - Oracle 中是否有与 WITH 关键字等效的 MySQL
- firebase - Firestore 定价 - 实时更新侦听器计为一次读取或数据更改次数
- markdown - 降价中是否可以有非标题锚?
- python - python中treeview中使用bbox的示例
- angular - ngOnInit() 中的 router.navigate 在页面重新加载时不起作用
- python - 使用moviepy连接电影剪辑的更快方法?