撇号在Java正则表达式中的地位

时间:2015-06-13 07:55:49

标签: java regex

我正在尝试查看日志模式布局是否有时间戳/日期字段,以及在按空格分割时其在布局中的位置。似乎撇号在正则表达式中的位置很重要。

E.g。当我有模式.*%d[ate]*\\{([\\w\\.'-\\:]+)}.*时,它匹配格式%X{IP} %X{field1} %X{field2} [%date{yyyy-MM-dd'T'HH:mm:ssZ} guid=%{guid} userId=%{userId} %msg%n的布局。但是,当我在正则表达式中交换-'时,我会收到如下运行时错误。

Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.util.regex.PatternSyntaxException: Illegal character range near index 19
.*%d[ate]*\{([\w\.-'\:]+)}.*
                   ^
    at java.util.regex.Pattern.error(Pattern.java:1955)
    at java.util.regex.Pattern.range(Pattern.java:2655)
    at java.util.regex.Pattern.clazz(Pattern.java:2562)
    at java.util.regex.Pattern.sequence(Pattern.java:2063)
    at java.util.regex.Pattern.expr(Pattern.java:1996)
    at java.util.regex.Pattern.group0(Pattern.java:2905)
    at java.util.regex.Pattern.sequence(Pattern.java:2051)
    at java.util.regex.Pattern.expr(Pattern.java:1996)
    at java.util.regex.Pattern.compile(Pattern.java:1696)
    at java.util.regex.Pattern.<init>(Pattern.java:1351)
    at java.util.regex.Pattern.compile(Pattern.java:1028)

如果你能解释撇号位置的重要性,那么它将更有助于更好地理解正则表达式的概念。

1 个答案:

答案 0 :(得分:3)

您似乎在字符类中转义了错误的字符。请注意,-是用于创建范围的特殊字符a-z,但.-'的范围不正确,因为.的索引不在Unicode表中'之前。

要使-简单文字转义为"\\-",或将其放在字符类([-...] [...-])的开头/结尾处,不再将其视为范围运算符。

此外,您无需在字符类中转义.: