Java正则需求:匹配仅含2个*且以3位数字结尾的字符串
Java正则表达式实现仅含2个'*'且以3位数字结尾的匹配
要满足仅包含2个'*'和以3位数字结尾这两个条件,核心是把原正则中匹配任意字符的.*替换为匹配除'*'之外的任意字符的表达式,同时用锚点限定整个字符串的范围,避免部分匹配导致的错误。
正确的正则表达式
String regex = "^[^*]*\\*[^*]*\\*[0-9]{3}$";
表达式拆解
^:锚定字符串起始位置,确保从开头开始匹配[^*]*:匹配零个或多个非'*'的字符([^*]是排除型字符类,表示除'*'外的任意字符)\*:匹配第一个''(需转义,因为''是正则元字符,Java字符串中要写两个反斜杠\\*)[^*]*:再次匹配零个或多个非''的字符,确保两个''之间没有额外的'*'\*:匹配第二个'*'[0-9]{3}:匹配恰好3位数字$:锚定字符串结束位置,确保整个字符串以3位数字收尾
原正则的问题
原表达式.*\*.*\*[0-9]{3}存在两个缺陷:
- 没有
^和$锚点,可能匹配字符串的某一部分(比如xyz*abc*123def会被误判为匹配) .*会匹配包含''在内的任意字符,导致无法限制''的总数(比如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
相关产品推荐
相关产品推荐

