递归正则表达式的意外行为
Unexpected behavior around recursive regex
我正在尝试匹配可以包含平衡 <
和 >
个字符的 C++ 参数类型。
使用这个正则表达式:
(\<(?>[^<>]|(?R))*\>)
在此字符串上:QMap<QgsFeatureId, QPair<QMap<Something, Complex> >>
它匹配除前 4 个字符之外的所有字符 (QMap)。
现在,如果我在正则表达式的开头添加 \w+
,它现在只匹配它的结尾 (QPair<QMap<Something, Complex> >>
) 而不是整个字符串。
这是什么解释,如何解决?
你可以在线试一下here。
这是为了在 Perl 5.10+ (5.24) 中使用。
(?R)
construct 递归 整个 模式。当您在开头添加 \w+
时,它也会在递归发生时被考虑在内。但是,您要递归的是 Group 1 子模式。
您需要一个 subroutine call 来递归捕获组子模式:
(\w+)(<(?:[^<>]++|(?2))*>)
详情
(\w+)
- 第 1 组捕获标识符(您可以将其更改为 [a-zA-Z]\w*
)
(<(?:[^<>]++|(?2))*>)
- 第 2 组(将被递归)
<
- 文字 <
(?:[^<>]++|(?2))*
- 除 <
和 >
之外的 1+ 个字符(自然地使其更快)或 (|
) 整个第 2 组模式( (?2)
).
>
- 文字 >
结果:
Match: QMap<QgsFeatureId, QPair<QMfap<Something, Complex> >>
Group 1: QMap
Group 2: <QgsFeatureId, QPair<QMfap<Something, Complex> >>
我正在尝试匹配可以包含平衡 <
和 >
个字符的 C++ 参数类型。
使用这个正则表达式:
(\<(?>[^<>]|(?R))*\>)
在此字符串上:QMap<QgsFeatureId, QPair<QMap<Something, Complex> >>
它匹配除前 4 个字符之外的所有字符 (QMap)。
现在,如果我在正则表达式的开头添加 \w+
,它现在只匹配它的结尾 (QPair<QMap<Something, Complex> >>
) 而不是整个字符串。
这是什么解释,如何解决?
你可以在线试一下here。
这是为了在 Perl 5.10+ (5.24) 中使用。
(?R)
construct 递归 整个 模式。当您在开头添加 \w+
时,它也会在递归发生时被考虑在内。但是,您要递归的是 Group 1 子模式。
您需要一个 subroutine call 来递归捕获组子模式:
(\w+)(<(?:[^<>]++|(?2))*>)
详情
(\w+)
- 第 1 组捕获标识符(您可以将其更改为[a-zA-Z]\w*
)(<(?:[^<>]++|(?2))*>)
- 第 2 组(将被递归)<
- 文字<
(?:[^<>]++|(?2))*
- 除<
和>
之外的 1+ 个字符(自然地使其更快)或 (|
) 整个第 2 组模式((?2)
).>
- 文字>
结果:
Match: QMap<QgsFeatureId, QPair<QMfap<Something, Complex> >>
Group 1: QMap
Group 2: <QgsFeatureId, QPair<QMfap<Something, Complex> >>