regex 处理捕获组内的令牌标识符

wsxa1bj1  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(111)

我一直在尝试匹配以下文本:

{1:A01ABCDEFGHIJKL1234567890}{2:01234567890123ABCDEFGHIJKL12345678901234567890A}{3:{108:ABCDEFGHIJK0123}}{4:
:20:ABCDEFGHIJK/01234
:25:00000000000000000000
:28C:00001/00001
:60F:C230316EUR0,00
:62F:C230317EUR0,00
:64:C230317EUR0,00
:65:C230318EUR0,00
:65:C230319EUR0,00
:65:C230320EUR0,00
:65:C230321EUR0,00
:65:C230322EUR0,00
-}

使用以下表达式:

(?<=\{)([^}]+)(?=\})

当括号是匹配组的一部分时,匹配失败。例如,以记录标识符3:是只部分匹配的,因为组中的结束括号是不匹配的。虽然我理解这是构造表达式的目的,但捕获结束括号的理想方法是什么?换句话说,匹配以记录标识符(如1:,2:,3:等)开头的两个括号之间的所有内容,但不要递归地应用它,否则嵌套文本也不会匹配。请提供建议。

这是demo

bz4sfanl

bz4sfanl1#

Java正则表达式不支持递归。如果只能有一级嵌套,您可以使用交替:

(?<=\{)\d+:(?:\{\d+:[^{}]*}|[^{}]+)(?=\})

说明

  • (?<=\{)正向后看,向左Assert{
  • \d+:匹配1+数字,后跟:
  • (?: 2个备选方案的非捕获组
  • \{\d+:[^{}]*}匹配{ 1+位和:,然后直到}
  • |
  • [^{}]+匹配1+除{}以外的字符
  • )关闭非捕获组
  • (?=\})正向预测,向右置位}

请参见regex demo
在Java中使用双转义反斜杠:

String regex = "(?<=\\{)\\d+:(?:\\{\\d+:[^\\{\\}]*\\}|[^\\{\\}]+)(?=\\})";

请注意,仅对于匹配项,您可以省略捕获组。

相关问题