Java正则表达式转义字符

Java正则表达式转义字符,java,regex,Java,Regex,我正在学习正则表达式,在实现过程中遇到了麻烦 我在Java教程中找到了RegexTestHarness,运行它时,以下字符串正确标识了我的模式: [\d|\s][\d]\. 我的模式是任何两位数,或任何一位数,前面有空格,后面有句号 该字符串由代码中的此行获得: Pattern pattern = Pattern.compile(console.readLine("%nEnter your regex: ")); 当我尝试在Eclipse中编写一个简单类时,它告诉我转义序列

我正在学习正则表达式,在实现过程中遇到了麻烦

我在Java教程中找到了RegexTestHarness,运行它时,以下字符串正确标识了我的模式:

[\d|\s][\d]\.
我的模式是任何两位数,或任何一位数,前面有空格,后面有句号

该字符串由代码中的此行获得:

Pattern pattern = 
        Pattern.compile(console.readLine("%nEnter your regex: "));
当我尝试在Eclipse中编写一个简单类时,它告诉我转义序列无效,除非我将字符串更改为:

[\\d|\\s][\\d]\\.
在我的课堂上,我使用'Pattern=Pattern.compile; 当我把这个字符串放回TestHarness时,它没有找到正确的匹配项

谁能告诉我哪一个是正确的吗?与console.readLine的某些格式是否存在差异

我的模式是任何两位数或一位数,前面是空格,后面是句号

正确的正则表达式为:

Pattern pattern = Pattern.compile("(\\s\\d|\\d{2})\\.");
此外,如果您从用户输入中获取正则表达式字符串,则应调用:

Pattern.quote(useInputRegex);
转义所有正则表达式特殊字符

此外,还可以进行双重转义,因为1个转义由String类处理,第2个转义传递给正则表达式引擎

我的模式是任何两位数或一位数,前面是空格,后面是句号

正确的正则表达式为:

Pattern pattern = Pattern.compile("(\\s\\d|\\d{2})\\.");
此外,如果您从用户输入中获取正则表达式字符串,则应调用:

Pattern.quote(useInputRegex);
转义所有正则表达式特殊字符


您还可以进行双重转义,因为1个转义由String类处理,第2个转义传递给正则表达式引擎。

发生的事情是转义序列被计算了两次。一次用于java,然后一次用于正则表达式

结果是,在使用正则表达式转义序列时,需要转义转义字符

例如,如果您需要一个数字,您可以使用

"\\d"

现在发生的事情是逃逸序列被评估了两次。一次用于java,然后一次用于正则表达式

结果是,在使用正则表达式转义序列时,需要转义转义字符

例如,如果您需要一个数字,您可以使用

"\\d"

如果要在Java字符串文字中表示反斜杠,则需要使用另一个反斜杠对其进行转义,因此字符串文字\\s是两个字符,\s。这意味着要表示正则表达式[\d\s][\d]\。在Java字符串文本中,您将使用[\\d\\s][\\d]\


请注意,我还对正则表达式做了一点修改,[\d |\s]将匹配数字、空格或文字字符。您只需要[\d\s]。字符类已经意味着匹配其中一个,因为在字符类中不需要|进行替换,它将失去其特殊意义。

如果要在Java字符串文字中表示反斜杠,则需要使用另一个反斜杠对其进行转义,因此字符串文字\\s是两个字符,\s。这意味着要表示正则表达式[\d\s][\d]\。在Java字符串文本中,您将使用[\\d\\s][\\d]\

请注意,我还对正则表达式做了一点修改,[\d |\s]将匹配数字、空格或文字字符。您只需要[\d\s]。字符类已经意味着匹配其中一个字符,因为在字符类中不需要|进行替换,它将失去其特殊含义。

\是字符串文字中的特殊字符。。。。它用于转义其他特殊字符,或创建类似\n\r\t的字符。 要创建可在正则表达式引擎中使用的字符串文本中的\字符,您需要通过在其前面添加另一个\来对其进行转义,就像您在正则表达式中需要转义其元字符(如点\)时所做的一样。。所以表示\的字符串看起来像\\

当您从用户读取数据时,此问题不存在,因为您已经在读取文本,所以即使用户将在控制台中写入,\n它也将被解释为两个字符\和\n

此外,在类内添加|字符[…]也没有意义,除非您的目的是使该类也匹配|字符,请记住,[abc]与a | b | c相同,因此在[\\d | \\s]中不需要|。

\是字符串文字中的特殊字符。。。。它用于转义其他特殊字符,或创建类似\n\r\t的字符。 要创建可在正则表达式引擎中使用的字符串文本中的\字符,您需要通过在其前面添加另一个\来对其进行转义,就像您在正则表达式中需要转义其元字符(如点\)时所做的一样。。所以表示\的字符串看起来像\\

当您从用户读取数据时,此问题不存在,因为您已经在读取文本,所以即使用户将在控制台中写入,\n它也将被解释为两个字符\和\n

此外,在类内添加|字符[…]也没有意义,除非您打算使该类也匹配|字符,请记住,[abc]与a | b | c相同,因此在[\\d | \\s]中不需要|。

您需要取消设置
rstand字符串文字和Java字符串转义的工作方式。此外,您的正则表达式不强制执行两位数前的空格。使用anubhava的正则表达式。我只寻找一位数之前的空格,或者两位数之前的空格不在乎。您需要了解字符串文字和Java字符串转义是如何工作的。此外,您的正则表达式不强制执行两位数之前的空格。使用anubhava的正则表达式。我只在一位数之前找空格,或者两位数之前找空格。对不起,我最初引用的帖子措词不当。我匹配的是前面有空格的一位数,或者是两位数;不管是哪种情况,后面都是一个……为我工作!!对不起,我最初引用的帖子措辞不当。我匹配的是前面有空格的一位数,或者是两位数;不管是哪种情况,后面都是一个……为我工作!!非常感谢。这解释了为什么通过示例程序/命令行输入的模式与编译时输入的模式不同。谢谢。这解释了为什么通过示例程序/命令行输入的模式与编译时输入的模式不同。