×
¥
查看详情
🔥 会员专享 文生代码 工具

正则表达式助手

👁️ 496 次查看
📅 Nov 18, 2025
💡 核心价值: 根据指定匹配需求生成精准正则表达式,详细解释各组成部分,并提供示例文本与代码演示,帮助快速应用于文本匹配与数据处理场景。

🎯 可自定义参数(6个)

正则类型
正则表达式类型,例如:PCRE、Python、JavaScript
匹配模式描述
需要匹配的模式描述,例如:电子邮件地址、日期YYYY-MM-DD、电话号码
示例文本
包含匹配模式的示例文本,例如:一个带有邮箱或日期的句子
可选说明
可选说明,例如:正则还应捕获邮箱的域名或所有标签
编程语言
演示代码使用的编程语言,例如:Python、JavaScript、Java
具体任务
代码需要完成的任务,例如:查找所有匹配、替换模式、验证输入、提取信息

🎨 效果示例

以下为满足要求的 Python 正则表达式与用法示例。

一、推荐正则表达式(忽略大小写,全局匹配) 模式(单行版,便于复制): \b(?P[A-Za-z0-9_+]+(?:.[A-Za-z0-9_+]+)*)@(?P(?:A-Za-z0-9?.)+[A-Za-z]{2,24})\b

说明(逐段解析):

  • \b
    • 单词边界,帮助避免把紧邻的字母数字粘连到邮箱两侧(例如结尾中文标点、空格等不会被误包含)。
  • (?P ... )
    • 命名捕获组 local,用于捕获邮箱的本地部分(@ 前)。
    • [A-Za-z0-9_+]+(?:.[A-Za-z0-9_+]+)*:
      • 允许字母、数字、下划线、加号;
      • 点仅作为分段分隔符:段.段 的形式,避免首尾点和连续点,更贴近日常邮箱格式。
  • @
    • 字面含义的 at 符号。
  • (?P ... )
    • 命名捕获组 domain,用于捕获域名部分(@ 后)。
    • (?:A-Za-z0-9?.)+:
      • 支持多级子域;每个标签
        • 以字母或数字开头与结尾;
        • 中间可含连字符(-),但不允许以连字符开头或结尾;
        • 典型长度约束至多 63 字符(通过 {0,61} 实现)。
    • [A-Za-z]{2,24}:
      • 顶级域名,仅允许字母,长度 2–24。
  • \b
    • 另一侧单词边界,避免把域名后续的字母数字继续误并入匹配。

二、示例文本 团队联系方式:

三、Python 代码示例 功能:提取所有邮箱地址;打印每个匹配的 local 与 domain;按 domain 分组计数;输出去重后的邮箱列表与总数。

import re
from collections import Counter

text = """团队联系方式:
- 开发: dev.team+build@lab.example.org
- 客服: support_cn@help.example.net
- 招聘: hr@jobs.example.com
亦可写作备选: user.name_2025+news@sub.example.net,欢迎投递。"""

# 编译正则(忽略大小写,使用 VERBOSE 便于阅读)
pattern = re.compile(r"""
    \b
    (?P<local>[A-Za-z0-9_+]+(?:\.[A-Za-z0-9_+]+)*)     # 本地部分
    @
    (?P<domain>(?:[A-Za-z0-9](?:[A-Za-z0-9-]{0,61}[A-Za-z0-9])?\.)+[A-Za-z]{2,24})  # 域名+TLD
    \b
""", re.IGNORECASE | re.VERBOSE)

# 1) 全局匹配并打印每个匹配的 local 与 domain
matches = list(pattern.finditer(text))
for m in matches:
    print(f"email={m.group(0)} | local={m.group('local')} | domain={m.group('domain')}")

# 2) 按域名分组计数(忽略大小写)
domain_counts = Counter(m.group('domain').lower() for m in matches)
print("\n按域名统计:")
for domain, count in domain_counts.most_common():
    print(f"{domain}: {count}")

# 3) 输出去重后的邮箱列表与总数(忽略大小写去重)
unique_emails = sorted({m.group(0).lower() for m in matches})
print("\n去重邮箱列表:")
for email in unique_emails:
    print(email)
print(f"总数: {len(unique_emails)}")

备注:

  • 使用 finditer 可实现“全局匹配”,并获取每个匹配的命名组 local 与 domain。
  • 去重与统计时使用 lower() 确保大小写不敏感。

以下给出一条适用于 Java 的正则表达式,以及其含义说明与完整示例代码(提取与脱敏)。

一、Java 正则表达式 (?<!\d)(?(?:25[0-5]|2[0-4]\d|1\d\d|0?\d{1,2})(?:.(?:25[0-5]|2[0-4]\d|1\d\d|0?\d{1,2})){3})(?::(?6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3}))?(?!\d)

二、组成部分解释

  • (?<!\d)
    • 负向前瞻的固定长度“左边界保护”:左侧不能是数字,避免在更长数字串中将一部分识别成 IP。
  • (? ... )
    • 命名捕获组 ip,抓取完整 IPv4 地址。
    • 单个八位段(octet):(?:25[0-5]|2[0-4]\d|1\d\d|0?\d{1,2})
      • 25[0-5]:250–255
      • 2[0-4]\d:200–249
      • 1\d\d:100–199
      • 0?\d{1,2}:0–99,允许前导零,且总长度不超过 3 位(如 0、00、000、01、009、099 等均可)。
    • 拼装四段:octet(?:.octet){3}
  • (?::(? ... ))?
    • 可选端口,前置冒号:
    • 命名捕获组 port,严格限制范围 1–65535:
      • 6553[0-5]:65530–65535
      • 655[0-2]\d:65500–65529
      • 65[0-4]\d{2}:65000–65499
      • 6[0-4]\d{3}:60000–64999
      • [1-5]\d{4}:10000–59999
      • [1-9]\d{0,3}:1–9999
  • (?!\d)
    • 负向后瞻的固定长度“右边界保护”:右侧不能是数字,确保端口或 IP 末尾后面不是数字(防止被更长数字串吞并)。

三、示例文本 2025-11-18 10:21:05 INFO client=10.4.23.8:8080 status=200 2025-11-18 10:21:07 WARN client=192.168.0.12 status=403 2025-11-18 10:21:10 INFO client=172.16.5.100:443 action=CONNECT 边界测试:source=255.255.255.255:65535 完整通过

四、Java 代码示例

  • 目标:
    • 提取每行的 ip 与 port 命名捕获组,返回对象列表。
    • 生成一个新日志文本,将匹配到的 IP 脱敏为 [IP],端口原样保留(如 [IP]:8080)。

示例代码(可直接运行): import java.util.; import java.util.regex.;

public class IpPortExtractorAndMasker {

// 结果对象
static class ClientEndpoint {
    final String ip;
    final Integer port; // null 表示未出现端口
    final int lineNo;

    ClientEndpoint(String ip, Integer port, int lineNo) {
        this.ip = ip;
        this.port = port;
        this.lineNo = lineNo;
    }

    @Override
    public String toString() {
        return "ClientEndpoint{ip=" + ip +
               ", port=" + (port == null ? "null" : port) +
               ", line=" + lineNo + "}";
    }
}

public static void main(String[] args) {
    String text = String.join("\n",
        "2025-11-18 10:21:05 INFO client=10.4.23.8:8080 status=200",
        "2025-11-18 10:21:07 WARN client=192.168.0.12 status=403",
        "2025-11-18 10:21:10 INFO client=172.16.5.100:443 action=CONNECT",
        "边界测试:source=255.255.255.255:65535 完整通过"
    );

    String OCTET = "(?:25[0-5]|2[0-4]\\d|1\\d\\d|0?\\d{1,2})";
    String PORT  = "(?:6553[0-5]|655[0-2]\\d|65[0-4]\\d{2}|6[0-4]\\d{3}|[1-5]\\d{4}|[1-9]\\d{0,3})";
    String REGEX = "(?<!\\d)(?<ip>(" + OCTET + ")(?:\\." + OCTET + "){3})(?::(?<port>" + PORT + "))?(?!\\d)";

    Pattern pattern = Pattern.compile(REGEX);

    // 1) 提取对象列表
    List<ClientEndpoint> endpoints = new ArrayList<>();
    String[] lines = text.split("\\R");
    for (int i = 0; i < lines.length; i++) {
        Matcher m = pattern.matcher(lines[i]);
        while (m.find()) {
            String ip = m.group("ip");
            String portStr = m.group("port");
            Integer port = (portStr == null) ? null : Integer.valueOf(portStr);
            endpoints.add(new ClientEndpoint(ip, port, i + 1));
        }
    }

    // 2) 生成脱敏日志(IP -> [IP],端口保留)
    Matcher m2 = pattern.matcher(text);
    StringBuffer masked = new StringBuffer();
    while (m2.find()) {
        String portStr = m2.group("port");
        String replacement = "[IP]" + (portStr != null ? ":" + portStr : "");
        m2.appendReplacement(masked, Matcher.quoteReplacement(replacement));
    }
    m2.appendTail(masked);

    // 输出结果
    System.out.println("提取结果:");
    for (ClientEndpoint e : endpoints) {
        System.out.println(e);
    }
    System.out.println("\n脱敏后的日志:");
    System.out.println(masked.toString());
}

}

说明

  • 使用命名捕获组 ip 与 port 来直接按名字读取字段:m.group("ip")、m.group("port")。
  • 使用 (?<!\d) 与 (?!\d) 保证匹配不嵌入到更长的数字串中(满足“避免匹配更长数字串的子串”的要求)。
  • 端口严格限制为 1–65535;IP 的每个八位段允许前导零(如 001、000、099 均可)。
  • 脱敏时用 appendReplacement/appendTail,并结合 Matcher.quoteReplacement,安全地构造替换串,将 IP 替换为 [IP] 并保留 “:端口”。

示例详情

该提示词已被收录:
“程序员必备:提升开发效率的专业AI提示词合集”
让 AI 成为你的第二双手,从代码生成到测试文档全部搞定,节省 80% 开发时间
√ 立即可用 · 零学习成本
√ 参数化批量生成
√ 专业提示词工程师打磨

📖 如何使用

30秒出活:复制 → 粘贴 → 搞定
与其花几十分钟和AI聊天、试错,不如直接复制这些经过千人验证的模板,修改几个 {{变量}} 就能立刻获得专业级输出。省下来的时间,足够你轻松享受两杯咖啡!
加载中...
💬 不会填参数?让 AI 反过来问你
不确定变量该填什么?一键转为对话模式,AI 会像资深顾问一样逐步引导你,问几个问题就能自动生成完美匹配你需求的定制结果。零门槛,开口就行。
转为对话模式
🚀 告别复制粘贴,Chat 里直接调用
无需切换,输入 / 唤醒 8000+ 专家级提示词。 插件将全站提示词库深度集成于 Chat 输入框。基于当前对话语境,系统智能推荐最契合的 Prompt 并自动完成参数化,让海量资源触手可及,从此彻底告别"手动搬运"。
即将推出
🔌 接口一调,提示词自己会进化
手动跑一次还行,跑一百次呢?通过 API 接口动态注入变量,接入批量评价引擎,让程序自动迭代出更高质量的提示词方案。Prompt 会自己进化,你只管收结果。
发布 API
🤖 一键变成你的专属 Agent 应用
不想每次都配参数?把这条提示词直接发布成独立 Agent,内嵌图片生成、参数优化等工具,分享链接就能用。给团队或客户一个"开箱即用"的完整方案。
创建 Agent

✅ 特性总结

轻松生成精准正则表达式,快速解决文本匹配与提取问题,适应多种场景需求。
提供示例代码与详细讲解,让用户即使没有正则经验也能快速上手和理解。
支持多种语言与平台的代码展示,帮助开发者直接借用生成的代码。
针对不同使用场景定制正则表达式,确保满足特定业务需求。
自动分析示例文本,智能优化表达式,减少用户自行调试时间。
清晰解释正则表达式的每一部分,让用户不仅会用,更能学会。
覆盖多种正则风格(如Python、JavaScript等),适配用户常见开发环境。
提供场景化应用指导,结合具体任务展示正则如何解决实际问题。
参数化提示词输入,用户只需简单描述需求即可生成符合需求的表达式。
内置最佳实践与优化建议,提高正则表达式的可读性与执行效率。

🎯 解决的问题

帮助用户快速生成适用于特定场景的正则表达式,同时提供详细的讲解以便于理解,并结合示例代码展示其实用性,适用于广泛的技术开发与数据处理场景。

🕒 版本历史

当前版本
v2.1 2024-01-15
优化输出结构,增强情节连贯性
  • ✨ 新增章节节奏控制参数
  • 🔧 优化人物关系描述逻辑
  • 📝 改进主题深化引导语
  • 🎯 增强情节转折点设计
v2.0 2023-12-20
重构提示词架构,提升生成质量
  • 🚀 全新的提示词结构设计
  • 📊 增加输出格式化选项
  • 💡 优化角色塑造引导
v1.5 2023-11-10
修复已知问题,提升稳定性
  • 🐛 修复长文本处理bug
  • ⚡ 提升响应速度
v1.0 2023-10-01
首次发布
  • 🎉 初始版本上线
COMING SOON
版本历史追踪,即将启航
记录每一次提示词的进化与升级,敬请期待。

💬 用户评价

4.8
⭐⭐⭐⭐⭐
基于 28 条评价
5星
85%
4星
12%
3星
3%
👤
电商运营 - 张先生
⭐⭐⭐⭐⭐ 2025-01-15
双十一用这个提示词生成了20多张海报,效果非常好!点击率提升了35%,节省了大量设计时间。参数调整很灵活,能快速适配不同节日。
效果好 节省时间
👤
品牌设计师 - 李女士
⭐⭐⭐⭐⭐ 2025-01-10
作为设计师,这个提示词帮我快速生成创意方向,大大提升了工作效率。生成的海报氛围感很强,稍作调整就能直接使用。
创意好 专业
COMING SOON
用户评价与反馈系统,即将上线
倾听真实反馈,在这里留下您的使用心得,敬请期待。
加载中...