我试图查看日志模式布局是否具有时间戳/日期字段及其在布局中被空格分割时的位置。看来正则表达式中撇号的位置很重要。
例如当我有模式 .*%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)
如果您能解释撇号位置的重要性,这确实有助于更好地理解正则表达式的概念。
最佳答案
您似乎在字符类中转义了错误的字符。请注意,在字符类/集 [..]
内部,-
字符用于创建字符范围,例如 a-z
。但是 .-'
不是正确的范围,因为 Unicode 表中 .
的索引大于 Unicode 表中 '
的索引(就像 z-a
无效)。
要使 -
简单文字,可以使用 "\\-"
对其进行转义,或者将其放置在无法被解释为范围一部分的位置,例如在字符类的开始/结束处([-...]
[...-]
)或之后其他范围,例如 [a-z-1]
(代表 a-z
范围、或 -
或 1
)。
此外,您不需要在字符类中转义 .
或 :
。
关于java - Java 正则表达式中撇号的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30816398/