为什么Java正则表达式在Linux和Windows上表现不同?

时间:2013-10-30 17:41:54

标签: java regex linux windows

这是一个普遍的问题。我想知道他们的行为有何不同以及为什么,或者只有在我们做错事情时他们的举止才会有所不同?

这就是我目前正在努力解决的问题。 我有这个正则表达式:

CLASS_NAME_VALIDATION_REGEX = "([a-zA-Z_$][a-zA-Z\\d_$]*\\.)*[a-zA-Z_$][a-zA-Z\\d_$]*";

我这样用它:

Pattern.matches(CLASS_NAME_VALIDATION_REGEX, qualifiedClassName)

所以在Unix / Linux下matches()在Windows上为java.io.Serializable返回true,它会返回false。

我是否有不正当的逃脱或有其他我不知道的事情?

谢谢,


所以它可能不是问题的正则表达式而且我正在考虑关闭这个问题,因为如果我是对的话,这将是非常不合适的主题。

我目前正在阅读包含类名并使用正则表达式匹配每个名称的文件。每个名字都在一个单独的行上。

Windows和Linux上的回车可能是不同字符的情况吗?

2 个答案:

答案 0 :(得分:4)

事实证明问题不在于评论者指出的正则表达式。

对于发现此问题的任何人 java正则表达式在Windows和Linux上的工作方式不同

实际问题是Linux行以\n结尾,而在Windows上以\r\n结尾,而ajb建议我在每个类名的末尾都有一个剩余的\r

所以

Pattern.matches("([a-zA-Z_$][a-zA-Z\\d_$]*\\.)*[a-zA-Z_$][a-zA-Z\\d_$]*", "java.io.Serializable\r")

返回false

答案 1 :(得分:2)

为我工作

import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexTest
{
    private static final Pattern pat = Pattern.compile("([a-zA-Z_$][a-zA-Z\\d_$]*\\.)*[a-zA-Z_$][a-zA-Z\\d_$]*");

    public static void main(String[] args) throws IOException
    {
        String data = "java.io.Serializable";
        Matcher m = pat.matcher(data);
        System.out.println(m.matches());
    }

}

输出:

true