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

Java中使用正则表达式判断字符串字符顺序匹配问题

Java正则实现字符串按顺序字符匹配(非连续、非子串)

需求说明

需要实现一个Java程序,通过正则表达式完成以下功能:

  • 从输入获取两个字符串(第一个字符串长度小于第二个)
  • 判断第一个字符串的所有字符是否按顺序出现在第二个字符串中(无需连续,不是子串匹配)
  • 匹配成功输出true,否则输出false

示例

示例1:

输入:
phantom
pphvnbajknzxcvbnatopopoim
输出:true

示例2:

输入:
apple
fgayiypvbnltsrgte
输出:false

现有代码问题分析

你当前的正则构建逻辑存在几个关键错误:

  1. 字符类使用错误:[:alnum:]是POSIX字符类的语法,在Java正则中必须包裹在[]内才生效,即[[:alnum:]],但这个只能匹配单个字母数字字符,无法满足"任意数量任意字符"的需求。
  2. 匹配逻辑错误:你给每个字符前后添加的规则只能匹配单个字符,而我们需要允许两个目标字符之间存在任意数量的任意字符,应该用.*来实现(.*匹配0个或多个任意字符,默认不匹配换行符)。
  3. 未处理正则特殊字符:如果第一个字符串包含正则元字符(如., *, +等),直接拼接会导致正则语法错误,需要对每个字符进行转义。

正确实现方案

核心思路是:将第一个字符串的每个字符转义后,用.*连接,构建出能按顺序匹配所有目标字符的正则表达式。

修改后的代码如下:

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()));
    }
}

代码解释

  1. 转义字符:使用Pattern.quote()对每个字符进行转义,确保即使字符是正则元字符(如$, ^)也能正确匹配。
  2. 正则构建:每个目标字符前添加.*,表示该字符之前可以有任意数量的任意字符;最后再添加.*匹配目标字符之后的剩余内容。
  3. matches方法:Java的String.matches()方法会自动在正则模式两端添加^和$,确保匹配整个字符串,符合需求。

如果需要支持包含换行符的第二个字符串,只需将.*替换为(?s).*((?s)是DOTALL模式,让.匹配换行符),修改后的模式构建代码如下:

patternBuilder.append("(?s).*").append(Pattern.quote(String.valueOf(c)));
// 最后一行改为
patternBuilder.append("(?s).*");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:02:57