有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中正则表达式的奇怪行为

我想过滤文本,只留下字母(a-z和a-z)。这似乎很容易,遵循这样的How to filter a Java String to get only alphabet characters?

String cleanedText = text.toString().toLowerCase().replaceAll("[^a-zA-Z]", "");         
System.out.println(cleanedText);

这个函数的输出是空的,除非我更改正则表达式,添加另一个字符,例如:-->[^:a-zA-Z]

我allready试图检查它是否适用于普通正则表达式(没有使用Java中String对象提供的方法ReplaceAll),但我遇到了完全相同的问题

你知道这种奇怪行为的根源是什么吗

我用BufferedReader读取了一个txt文件。我将每一行添加到一个长字符串中,并将之前发布的代码应用于此。整个代码如下:

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.StringBuffer;
import java.util.regex.*;

public class Loader {

    public static void main(String[] args) {

        BufferedReader file = null;
        StringBuffer text = new StringBuffer();
        String str;

        try {
            file = new BufferedReader(new FileReader("text.txt"));
        } catch (FileNotFoundException ex) {
        }
        try

        {
            while ((str = file.readLine()) != null) {
                text.append(str);

            }

            String cleanedText = text.toString().toLowerCase().replaceAll("[^:a-z]", "");       
            System.out.println(cleanedText);
        } catch (IOException ex) {
        }
    }   
}

文本文件是一篇普通的文章,我想删除不是字母的所有内容(包括空格)。一个摘录如下:(16)自由软件基金会(FSF),从1985开始,意指“免费”一词意指分配“

”的自由度。

共 (2) 个答案

  1. # 2 楼答案

    正如我在评论中所写,请更准确地说明问题所在

    我试过的

    public class Regexp45348303 {
    
        public static void main(String[] args) {
            String[] tests = { "abc01", "01DEF34", "abc 01 def.", "a0101\n0202\n0303x" };
            for (String text : tests) {
                String cleanedText = text.toLowerCase().replaceAll("[^a-z]", ""); // A-Z removed too     
                System.out.println(text + " -> " + cleanedText);
            }
        }
    }
    

    结果是:

    abc01 -> abc
    01DEF34 -> def
    abc 01 def. -> abcdef
    a0101
    0202
    0303x -> ax
    

    根据我的理解这是正确的