为啥 Java 正则表达式在 Linux 和 Windows 上的行为不同?

Posted

技术标签:

【中文标题】为啥 Java 正则表达式在 Linux 和 Windows 上的行为不同?【英文标题】:Why do Java regular expressions behave differently on Linux and Windows?为什么 Java 正则表达式在 Linux 和 Windows 上的行为不同? 【发布时间】:2013-10-30 17:41:53 【问题描述】:

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

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

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() 返回 true,而在 Windows 上 java.io.Serializable 返回 false。

我是否有不恰当地逃避了某些事情,或者还有什么我不知道的事情?

谢谢,


所以问题可能不是正则表达式,我正在考虑结束这个问题,因为如果我是对的,这将是非常离题的。

我目前正在读取一个包含类名并将每个名称与正则表达式匹配的文件。每个名称都在单独的一行中。

Windows 和 Linux 上的回车符会不会是不同的字符?

【问题讨论】:

为了让我们更容易使用它,请附上一个 SSCCE(你几乎已经拥有它了)。 @NPE SSCCE ? (最小字符) 对不起,应该包含一个链接:sscce.org 基本上,我们可以复制粘贴,无需修改即可运行。 我的猜测:确保qualifiedClassName 中没有任何多余的字符。也许在 Windows 上,它一开始是带有 \r\n 的东西,你删除了 \n 但仍然有一个 \r 卡在里面?附:我在您编辑问题的同时添加了这个。幽灵般的。万圣节快乐。 【参考方案1】:

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

对于任何发现此问题的人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

【讨论】:

【参考方案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

【讨论】:

以上是关于为啥 Java 正则表达式在 Linux 和 Windows 上的行为不同?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我必须在 Java 正则表达式中指定整个字符串? [复制]

正则表达式

当输入字符串为 abccabaaaccbbbc 时,为啥 Java 正则表达式模式“[abc]3”与 abc 匹配

notepad++匹配汉字的正则表达式与Java中的为啥不同?

正则表达式[\u4E00-\u9fa5]为啥能匹配到数字,字母和某些符号?

为啥所有浏览器都可以用正则表达式