具有 if/else 条件的正则表达式正前瞻

regex positive lookahead with if/else condition

我正在尝试编写一个正则表达式来检查模式是否存在,如果存在,则匹配其后的所有内容,如果(且仅当)不存在,则匹配另一个模式之后的所有内容。

示例行:

http://example.com/contact
www.example.com/contact
http://www.example.com/contact

所有 3 种情况下的预期输出:example

这是我期望的正则表达式:

(?(?<=www\.).+|(?<=http:\/\/).+)(?=\.com)

我假设会:

  1. 检查是否可以找到 "www."
  2. 如果是,将匹配其后的所有内容
  3. 如果不是,则匹配 "http://"
  4. 之后的所有内容
  5. 将匹配限制为出现“.com”之前的所有内容

对于前两行,表达式运行良好,但在第三行匹配 www.example 而不仅仅是 example。这是否意味着尽管满足 if 条件,但由于某种原因执行了 else 命令?

如何更改上面的表达式,使其仅在未找到 www. 部分时才进行 http// 前瞻?

正在将我的评论转换为答案。

您可以使用这个正则表达式:

^(?:https?://(?:www\.)?|www\.)\K\S+?(?=\.com(?:/|$))

RegEx Demo

正则表达式说明:

  • ^: 开始
  • (?:https?://(?:www\.)?|www\.):匹配http://www.http://或(https)
  • \K: 重置匹配信息
  • \S+?:匹配1+个非space字符(懒)
  • (?=\.com(?:/|$)):使用前瞻断言我们有 .com 或前面的行尾