我正在尝试查看日志模式布局是否有时间戳/日期字段,以及在按空格分割时其在布局中的位置。似乎撇号在正则表达式中的位置很重要。
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)
如果你能解释撇号位置的重要性,那么它将更有助于更好地理解正则表达式的概念。
答案 0 :(得分:3)
您似乎在字符类中转义了错误的字符。请注意,-
是用于创建范围的特殊字符a-z
,但.-'
的范围不正确,因为.
的索引不在Unicode表中'
之前。
要使-
简单文字转义为"\\-"
,或将其放在字符类([-...]
[...-]
)的开头/结尾处,不再将其视为范围运算符。
此外,您无需在字符类中转义.
或:
。