我一直在尝试匹配以下文本:
{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。
1条答案
按热度按时间bz4sfanl1#
Java正则表达式不支持递归。如果只能有一级嵌套,您可以使用交替:
说明
(?<=\{)
正向后看,向左Assert{
\d+:
匹配1+数字,后跟:
(?:
2个备选方案的非捕获组\{\d+:[^{}]*}
匹配{
1+位和:
,然后直到}
|
或[^{}]+
匹配1+除{
或}
以外的字符)
关闭非捕获组(?=\})
正向预测,向右置位}
请参见regex demo。
在Java中使用双转义反斜杠:
请注意,仅对于匹配项,您可以省略捕获组。