我正在尝试编写一个正则表达式,该表达式将检查某个模式是否存在,如果存在,则匹配其后面的所有内容,如果(且仅当)不存在,则匹配另一个模式之后的所有内容。
示例行:
http://example.com/contact
www.example.com/contact
http://www.example.com/contact
所有 3 种情况的预期输出:示例
这是我期望完成这项工作的正则表达式:
(?(?<=www\.).+|(?<=http:\/\/).+)(?=\.com)
我认为会:
- 检查是否为“www”。待找到
- 如果是,将匹配其后的所有内容
- 如果没有,则匹配“http://”后面的所有内容
- 限制匹配“.com”之前的所有内容
对于前两行,表达式运行良好,但在第三行中匹配了 www.example
而不仅仅是 example
。这是否意味着尽管满足了 if
条件,但由于某种原因仍执行了 else
命令?
如何更改上述表达式,以便在未找到 www.
部分时仅进行 http//
前瞻?
最佳答案
将我的评论转换为答案。
您可以使用此正则表达式:
^(?:https?://(?:www\.)?|www\.)\K\S+?(?=\.com(?:/|$))
正则表达式说明:
^
:开始(?:https?://(?:www\.)?|www\.)
:匹配http://www.
或http://
或 (https
)\K
:重置匹配信息\S+?
:匹配 1 个以上非空格字符(惰性)(?=\.com(?:/|$))
:使用前瞻断言我们前面有.com
或行尾
关于带有 if/else 条件的正则表达式正向预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51710063/