【问题标题】:Java Regular Expression - Characters "(" and ")"Matches the Pattern "[\\p{Alpha} '-,.]"Java 正则表达式 - 字符 "(" 和 ")" 匹配模式 "[\\p{Alpha} '-,.]"
【发布时间】:2014-06-23 04:18:02
【问题描述】:

我一直想知道为什么字符 "("")" 匹配模式 "[\\p{Alpha} '-,.]"
请看一下我的代码。方法matches 将为字符"("")" 返回true
另外,如果我尝试匹配我的模式,是否还有其他字符会返回 true

import java.util.regex.Pattern;
public class Main {
    public static void main(String[] args) {
        String pattern = "[\\p{Alpha} '-,.]";
        //String text = "(";
        String text = ")";
        System.out.print(Pattern.matches(pattern, text));
    }
}

【问题讨论】:

    标签: java regex pattern-matching match


    【解决方案1】:

    这是因为'-,被插入为范围,相当于'()*+,,尝试转义减号"[\\p{Alpha} '\\-,.]"

    【讨论】:

    • 我明白了。我已经在我的模式中转义了 - 符号。谢谢!
    【解决方案2】:

    只需双重转义 ) 符号,

    import java.util.regex.Pattern;
    public class Main {
        public static void main(String[] args) {
            String pattern = "[\\p{Alpha} '-,.]";
            //String text = "(";
            String text = "\\)";
            System.out.print(Pattern.matches(pattern, text));
        }
    }
    

    【讨论】:

    • 嗨阿维纳什。这实际上奏效了。但我想知道为什么。顺便说一句,谢谢! + 用于此解决方案。
    • 这是错误的。 matches() 方法要求正则表达式匹配整个目标字符串,因此在这种情况下,它的作用就像正则表达式是 \A[\p{Alpha} '-,.]\z。关闭] 之后没有+*,所以这个正则表达式只能匹配一个字符长的字符串。您在目标字符串中添加了另一个字符,所以它当然不再匹配了。如果你使用find() 而不是matches(),你会发现它会跳过` but still incorrectly matches the )`。
    • @AlanMoore 感谢您的信息。如果他不放置\` before )`,它会起作用吗?
    • 天啊!我没有注意到我的评论中的混乱格式。你的也搞砸了,所以我就随手一拍吧。问题出在正则表达式中,因此尝试修复目标字符串毫无意义。要么使用反斜杠转义连字符,如接受的答案 ([\p{Alpha} '\-,.]),要么将其移动到正则表达式编译器知道它应该匹配文字连字符 ([\p{Alpha} ',.-]) 的末尾。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 2016-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多