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

Java正则需求:匹配仅含2个*且以3位数字结尾的字符串

Java正则表达式实现仅含2个'*'且以3位数字结尾的匹配

要满足仅包含2个'*'和以3位数字结尾这两个条件,核心是把原正则中匹配任意字符的.*替换为匹配除'*'之外的任意字符的表达式,同时用锚点限定整个字符串的范围,避免部分匹配导致的错误。

正确的正则表达式

String regex = "^[^*]*\\*[^*]*\\*[0-9]{3}$";

表达式拆解

  • ^:锚定字符串起始位置,确保从开头开始匹配
  • [^*]*:匹配零个或多个非'*'的字符([^*]是排除型字符类,表示除'*'外的任意字符)
  • \*:匹配第一个''(需转义,因为''是正则元字符,Java字符串中要写两个反斜杠\\*)
  • [^*]*:再次匹配零个或多个非''的字符,确保两个''之间没有额外的'*'
  • \*:匹配第二个'*'
  • [0-9]{3}:匹配恰好3位数字
  • $:锚定字符串结束位置,确保整个字符串以3位数字收尾

原正则的问题

原表达式.*\*.*\*[0-9]{3}存在两个缺陷:

  1. 没有^和$锚点,可能匹配字符串的某一部分(比如xyz*abc*123def会被误判为匹配)
  2. .*会匹配包含''在内的任意字符,导致无法限制''的总数(比如a*b*c*123这种有3个'*'的字符串也会被匹配)

测试代码示例

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

public class RegexTest {
    public static void main(String[] args) {
        Pattern pattern = Pattern.compile("^[^*]*\\*[^*]*\\*[0-9]{3}$");
        
        String[] testCases = {
            "test*demo*456",   // 符合条件 → true
            "*abc*789",        // 符合条件 → true
            "foo**123",        // 符合条件 → true
            "a*b*c*123",       // 3个'*' → false
            "abc*123",         // 1个'*' → false
            "abc*def*12",      // 结尾2位数字 → false
            "abc*def*123x"     // 结尾含非数字 → false
        };
        
        for (String test : testCases) {
            Matcher matcher = pattern.matcher(test);
            System.out.printf("字符串 '%s' 匹配结果: %b%n", test, matcher.matches());
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:15:29