Java 正则表达式的后视组在附近没有明显的最大长度

Posted

技术标签:

【中文标题】Java 正则表达式的后视组在附近没有明显的最大长度【英文标题】:Look-behind group for a Java regular expression does not have an obvious maximum length near 【发布时间】:2013-12-20 15:22:24 【问题描述】:

我想:

当我得到一个大字符串时,我需要使用 Java 中的正则表达式在其中查找内容,以使用以下公式进行分隔:

如果一行(\n 之后)有超过 1000 个字符,请检查第 1000 个字符是否包含在奇数 ' 之后。 然后添加一个连接字符串'\n||'介于 1000 到 1001 个字符之间 如果 1000 和 1001 字符是 ''(plsql 的转义字符),则将其插入到 1001 和 1002 之间

反正我做了这个正则表达式:

"\n(?<kiloCharacters>[^\n]1000)(?<=(?<newLine>\n)(?<pairsAndText>[^'\n]0,1001|[^\n']0,1001'[^\n']0,1001'[^\n']0,1001)0,1001(?<oddComa>')(?<text>[^\n']0,1001))(?(?<=')(?!'))"

让我解释一下:

"\n(?<kiloCharacters>[^\n]1000) --> Newline and 1000 characters
(?<= --> Let's look behind to check if we have an odd number of '
  (?<newLine>\n) --> Start from new line
  (?<pairsAndText> --> All pairs of '
    [^'\n]0,1001 --> Eighter 0 '
    | --> or
    [^\n']0,1001'[^\n']0,1001'[^\n']0,1001)0,1001 --> (text* ' text* ' text* )*
  (?<oddComa>') --> Last comma
  (?<text>[^\n']0,1001) --> Text after that comma
) --> End of actual looking behind
(?(?<=')(?!'))" --> This part check if we are inside an escaped character '' as we can not concat stuff between here

无论如何,我似乎得到了以下错误。

线程“main”java.util.regex.PatternSyntaxException 中的异常:后视组在索引 161 附近没有明显的最大长度

  (?<kiloCharacters>[^
  ]1000)(?<=(?<newLine>
  )(?<pairsAndText>[^'
  ]0,1001|[^
  ']0,1001'[^
  ']0,1001'[^
  ']0,1001)0,1001(?<oddComa>')(?<text>[^
  ']0,1001))(?(?<=')(?!'))
                                                                                                                                                                   ^
      at java.util.regex.Pattern.error(Unknown Source)
      at java.util.regex.Pattern.group0(Unknown Source)
      at java.util.regex.Pattern.sequence(Unknown Source)
      at java.util.regex.Pattern.expr(Unknown Source)
      at java.util.regex.Pattern.compile(Unknown Source)
      at java.util.regex.Pattern.<init>(Unknown Source)
      at java.util.regex.Pattern.compile(Unknown Source)
      at java.lang.String.replaceAll(Unknown Source)

为什么要这样做?我没有使用 0,1001 而不是 * 来限制吗?

【问题讨论】:

【参考方案1】:

Java 的正则表达式引擎不支持变长查找。这意味着当后视的长度不固定时,引擎将抛出此异常。你看后面的长度是可变的,因此你得到这个异常。

Java regex error - Look-behind group does not have an obvious maximum length

【讨论】:

以上是关于Java 正则表达式的后视组在附近没有明显的最大长度的主要内容,如果未能解决你的问题,请参考以下文章

如何匹配长与 Java 正则表达式?

Javascript 正则表达式(负)后视在 Firefox 中不起作用

复杂的 (PHP) 正则表达式,具有积极的后视能力

查找连续重复单词时的Python后视正则表达式“固定宽度模式”错误

正则表达式替换文本,除非它前面有反斜杠而不使用后视

为啥这个重复的内部组在正则表达式中不匹配? [复制]