带有 if/else 条件的正则表达式正向预测

标签 regex pcre

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

示例行:

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

所有 3 种情况的预期输出:示例

这是我期望完成这项工作的正则表达式:

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

我认为会:

  1. 检查是否为“www”。待找到
  2. 如果是,将匹配其后的所有内容
  3. 如果没有,则匹配“http://”后面的所有内容
  4. 限制匹配“.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 个以上非空格字符(惰性)
  • (?=\.com(?:/|$)):使用前瞻断言我们前面有 .com 或行尾

关于带有 if/else 条件的正则表达式正向预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51710063/

相关文章:

正则表达式 : replace multiple groups with unknown groups number

regex - 将字符串中单词的首字母大写

javascript - 正则表达式忽略括在(括号)中的字符串值;并在清除输入框时删除标记

REGEX 捕获不同组的重复组

c - 使用 PCRS 进行替换的工作示例

regex - 如何使用 pcregrep 排除多个目录?

java - String.matches() 意外返回 false。

regex - 在正则表达式中排除某个双字符

php - 用于匹配任意长度的所有重复子串的正则表达式

r - 为什么\K 似乎消耗了基本 R 的 gsub 中的一个字符