You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则表达式编写求助:匹配特定格式的三段式字符串

解决三段式连字符分隔字符串的正则匹配问题

我来帮你搞定这个正则的问题!先看看你原来的正则哪里踩坑了:

  • 你写的[^%\-\s]直接把空格排除了,但规则里第一、二部分是允许包含空格的,只是不能全是空格
  • 原正则没做“不能仅为空格”的校验,而且在字符范围的定义上搞错了逻辑

正确的正则表达式

先给你能用的最终正则,分两种写法,你选顺手的就行:

写法一(排除法,更贴合规则描述)

^(?![\s]+$)(?:[^%-]|\s){1,10}-(?![\s]+$)(?:[^%-]|\s){1,12}-\d{4,9}$

写法二(枚举允许的字符,更直观)

^(?![\s]+$)[\w\s!@#$^&*()_+=,.?/:;'\"`~<>]{1,10}-(?![\s]+$)[\w\s!@#$^&*()_+=,.?/:;'\"`~<>]{1,12}-\d{4,9}$

逐部分拆解逻辑

咱们一步步看这个正则是怎么满足你的所有规则的:

  1. 首尾锚定:^和$确保整个字符串都要符合规则,不会出现匹配到部分子串的情况(配合Java的matches()方法,双重保障)
  2. 第一部分校验:
    • (?![\s]+$):这是个负向预查,意思是“这部分不能全是空格”,完美解决你说的“不能仅为空格”的要求
    • (?:[^%-]|\s){1,10}:匹配1-10个字符,每个字符要么是除了%和-之外的任意字符,要么是空格——完全贴合规则里“可包含字母数字、除%和-外的所有特殊字符,允许空格”的要求,长度{1,10}也符合
  3. 分隔符:单个-,整个正则里只有两个这样的分隔符,确保字符串是严格的三段式
  4. 第二部分校验:
    • 和第一部分逻辑一致,只是长度限制改成了{1,12},满足规则里第二部分1-12的长度要求
  5. 第三部分校验:
    • \d{4,9}:匹配4-9个数字,直接满足“仅允许数字、不能为空、长度4-9”的所有要求

验证你给的示例

咱们来测试你提到的示例,确保都符合预期:

  • 合法字符串:
    • "1sAS-c$AS-01238" → 匹配成功
    • "t t-c:t-012345678" → 第一部分有空格但不是全空格,匹配成功
    • "t$t-c 2:t-012345678" → 同上,匹配成功
  • 非法字符串:
    • "1sA%S-c$AS-01238" → 第一部分有%,匹配失败
    • " -c:t-01235678" → 第一部分全是空格,匹配失败
    • "t$t- -01234578" → 第二部分全是空格,匹配失败
    • "t-$t-check-012378" → 有三个连字符,结构不对,匹配失败
    • "test%t1z" → 没有连字符,结构不对,匹配失败

Java代码验证示例

把正则放到你的代码里就能用,给你写个完整的测试例子:

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class SegmentRegexTest {
    public static void main(String[] args) {
        String regex = "^(?![\\s]+$)(?:[^%-]|\\s){1,10}-(?![\\s]+$)(?:[^%-]|\\s){1,12}-\\d{4,9}$";
        Pattern pattern = Pattern.compile(regex);

        // 测试合法用例
        testMatch(pattern, "1sAS-c$AS-01238");
        testMatch(pattern, "t t-c:t-012345678");
        testMatch(pattern, "t$t-c 2:t-012345678");

        // 测试非法用例
        testMatch(pattern, "1sA%S-c$AS-01238");
        testMatch(pattern, " -c:t-01235678");
        testMatch(pattern, "t$t- -01234578");
        testMatch(pattern, "t-$t-check-012378");
        testMatch(pattern, "test%t1z");
    }

    private static void testMatch(Pattern pattern, String input) {
        Matcher matcher = pattern.matcher(input);
        System.out.printf("Input: \"%s\" → Match: %b%n", input, matcher.matches());
    }
}

运行这个代码,输出会和咱们预期的一致,合法的返回true,非法的返回false。

内容的提问来源于stack exchange,提问作者mgr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 16:47:32