java - Java 正则表达式中撇号的位置

标签 java regex

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

例如当我有模式 .*%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/

相关文章:

java - 匹配 '\n' 字符的正则表达式

regex - 正则表达式中 Kleene 星幂等性的形式化

c# - 正则表达式查找 'good enough' 序列

java - "Document"关键字和 ".something"是什么意思?

java - 处理 csv 文件的不同分隔符

php - 如何使用 preg_replace 将类名注入(inject) html 节点?

regex - alpha 正则表达式不会在 bash 中挑选出 alpha 字符

Java : Bound mismatch error

java - 如何从列表中分配一个数字 - JDBC JAVA SQL

java - stdin 数据流的第一个字节是否会触发 bash 命令运行?