Java正则表达式编写需求:基于指定合法/非法字符串与规则
解决方案
要满足你的需求,我们可以构建一个兼顾平衡匹配、y的存在性和**$的位置唯一性**的Java正则表达式。先明确核心规则:
- 字符串必须以唯一的
$结尾 - 必须包含至少一个
y <t>和<\t>(也就是你示例里的< >,对应<加制表符的序列)的出现次数必须完全相等- 只能包含
y、<t>、<\t>和结尾的$
正则表达式代码
import java.util.regex.Pattern; import java.util.regex.Matcher; public class RegexValidator { public static void main(String[] args) { // 核心正则表达式 String regex = "^(?=.*y)(?:<t>(?<DEPTH>)|<\\t>(?<-DEPTH>)|y)+(?(DEPTH)(?!))\\$$"; Pattern pattern = Pattern.compile(regex); // 测试合法示例 String[] validStrings = { "yyyyy$", "<t>yy\t>$", // 此处\t对应示例中的< > "<t><t>yyyyy\t>\t>$", "<t><t>y\t>y\t><t>yyyyy\t>yy$" }; // 测试非法示例 String[] invalidStrings = { "<t>\t>$", "<t>yy<t>\t>$" }; // 验证合法字符串 System.out.println("合法字符串验证结果:"); for (String s : validStrings) { Matcher matcher = pattern.matcher(s); System.out.printf("'%s' → %b%n", s, matcher.matches()); } // 验证非法字符串 System.out.println("\n非法字符串验证结果:"); for (String s : invalidStrings) { Matcher matcher = pattern.matcher(s); System.out.printf("'%s' → %b%n", s, matcher.matches()); } } }
正则细节拆解
让我们逐个解释正则的关键部分:
^:锚定字符串开头,确保匹配从第一个字符开始(?=.*y):正向预查,强制要求字符串中至少包含一个y,没有的话直接匹配失败(?:<t>(?<DEPTH>)|<\\t>(?<-DEPTH>)|y)+:非捕获组,重复匹配三种允许的内容:<t>(?<DEPTH>):匹配<t>序列,同时给命名捕获组DEPTH的计数加1<\\t>(?<-DEPTH>):匹配<\t>序列(对应示例里的< >),同时给DEPTH计数减1y:匹配单个y字符
(?(DEPTH)(?!)):条件判断,如果DEPTH的最终计数不为0(也就是<t>和<\t>数量不相等),则匹配失败\\$$:匹配结尾的$(第一个\转义正则里的特殊字符$,第二个$锚定字符串结尾,确保$只能出现在最后且唯一)
注意事项
- 该正则依赖Java 7及以上的命名捕获组和平衡匹配特性,如果你使用更早的Java版本,需要调整实现逻辑
- 若你示例中的
< >不是<加制表符,只需替换正则里的<\\t>部分为对应的序列即可
内容的提问来源于stack exchange,提问作者Sidra Jawaid
相关产品推荐
相关产品推荐

