首页 > 解决方案 > 类中的 Java 正则表达式匹配类

问题描述

嘿,所以我已经在互联网上搜索了各种示例,但我无法使用以下正则表达式。我正在尝试从与我的模式不匹配的字符串列表条目中删除每个字符。

例如,我的模式看起来像这样:e2-e4、d4-d5,有时可能会给出特定的最后一个字符。

首先,每一行都使用以下模式进行过滤:

List<String> lines = Files.readAllLines(Paths.get(String.valueOf(file)));
        Pattern pattern = Pattern.compile("[a-h][1-8]-[a-h][1-8][BQNRbqnr]?");
        List<String> filteredLines = lines.stream().filter(pattern.asPredicate()).collect(Collectors.toList());

但是,如果我输入了这样的 garbo1239%)@a2-a5,我希望将 garbo 过滤掉。

对于这个问题,我想出了以下解决方案:我遍历我的 String 列表并使用 replaceAll 方法过滤掉垃圾:

for(int i = 0; i < filteredLines.size(); i++){
            filteredLines.set(i, filteredLines.get(i).replaceAll("[^[a-h][1-8]-[a-h][1-8]][BQNRbqnr]?",""));
        }

不幸的是,它没有达到预期的效果。像 a2-a4d 或 h7-h614 这样的东西仍然没有被“清理”,我真的不知道为什么。我希望有人可以帮助我,在此先感谢!

标签: javaregexclass

解决方案


你可以这样做:

public class Main {
    public static void main(String[] args) {
        // Test strings
        String[] arr = { "garbo1239%)@a2-a5", "a2-a4d", "h7-h614" };
        for (String str : arr) {
            System.out.println(str.replaceAll(".*?([a-h][1-8]-[a-h][1-8][BQNRbqnr]?).*", "$1"));
        }
    }
}

输出:

a2-a5
a2-a4
h7-h6

说明:用 group(1) 替换给定的字符串,$1其中 group(1) 包含所需输出的正则表达式以及需要丢弃之前或之后的所有内容。


推荐阅读