Java中使用正则表达式判断字符串字符顺序匹配问题
Java正则实现字符串按顺序字符匹配(非连续、非子串)
需求说明
需要实现一个Java程序,通过正则表达式完成以下功能:
- 从输入获取两个字符串(第一个字符串长度小于第二个)
- 判断第一个字符串的所有字符是否按顺序出现在第二个字符串中(无需连续,不是子串匹配)
- 匹配成功输出
true,否则输出false
示例
示例1:
输入:
phantom
pphvnbajknzxcvbnatopopoim
输出:true
示例2:
输入:
apple
fgayiypvbnltsrgte
输出:false
现有代码问题分析
你当前的正则构建逻辑存在几个关键错误:
- 字符类使用错误:
[:alnum:]是POSIX字符类的语法,在Java正则中必须包裹在[]内才生效,即[[:alnum:]],但这个只能匹配单个字母数字字符,无法满足"任意数量任意字符"的需求。 - 匹配逻辑错误:你给每个字符前后添加的规则只能匹配单个字符,而我们需要允许两个目标字符之间存在任意数量的任意字符,应该用
.*来实现(.*匹配0个或多个任意字符,默认不匹配换行符)。 - 未处理正则特殊字符:如果第一个字符串包含正则元字符(如
.,*,+等),直接拼接会导致正则语法错误,需要对每个字符进行转义。
正确实现方案
核心思路是:将第一个字符串的每个字符转义后,用.*连接,构建出能按顺序匹配所有目标字符的正则表达式。
修改后的代码如下:
import java.util.Scanner; import java.util.regex.Pattern; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); String word1 = input.next(); String word2 = input.next(); input.close(); // 构建正则模式:按顺序匹配每个字符,中间允许任意内容 StringBuilder patternBuilder = new StringBuilder(); for (char c : word1.toCharArray()) { // 转义每个字符,避免正则元字符干扰 patternBuilder.append(".*").append(Pattern.quote(String.valueOf(c))); } // 匹配目标字符之后的剩余内容 patternBuilder.append(".*"); // 使用matches方法判断(默认匹配整个字符串) System.out.println(word2.matches(patternBuilder.toString())); } }
代码解释
- 转义字符:使用
Pattern.quote()对每个字符进行转义,确保即使字符是正则元字符(如$,^)也能正确匹配。 - 正则构建:每个目标字符前添加
.*,表示该字符之前可以有任意数量的任意字符;最后再添加.*匹配目标字符之后的剩余内容。 - matches方法:Java的
String.matches()方法会自动在正则模式两端添加^和$,确保匹配整个字符串,符合需求。
如果需要支持包含换行符的第二个字符串,只需将.*替换为(?s).*((?s)是DOTALL模式,让.匹配换行符),修改后的模式构建代码如下:
patternBuilder.append("(?s).*").append(Pattern.quote(String.valueOf(c))); // 最后一行改为 patternBuilder.append("(?s).*");
内容的提问来源于stack exchange,提问作者Phantom
相关产品推荐
相关产品推荐

