我想为以下内容提出一个正则表达式:
<action>::=Action(<entity><entity><Asset>)
我想要令牌,例如:
Action(
<entity>
<entity>
<Asset>
)
entity和asset周围有<>,Action后面跟着“(”。但是,“)”是一个独立的token。我正在使用以下内容:
([a-zA-Z]+\\()|((<.*?>)|([a-zA-Z]*))|(\\))?
但它没有显示")"作为令牌?我究竟做错了什么?
试试这个正则表达式:
([a-zA-Z]*\\()|(<[a-zA-Z]*>)|(\\))
您的正则表达式实际上有问题,或者至少它使表达式以一种意想不到的方式表现(对我来说)。
表达式可以这样分解:
([a-zA-Z]+\\()| (?# matches alphabetical characters and an opening round-bracket)
((<.*?>)| (?# non-greedily matches anything between brackets)
([a-zA-Z]*))| (?# 3rd pattern: may match an empty string)
(\\))? (?# 4th pattern: optionally matches a closing round bracket)
由于|运算符从不贪婪,因此在您实际想要的第四个模式之前触发第三个模式(匹配空字符串)。
证明这一点的是,您使用正则表达式实际获得的标记是:
''
''
''
'Action('
'<entity>'
'<entity>'
'<Asset>'
''
''
因此,您想要的可能是这样的:
([a-zA-Z]+\\()| (?# matches alphabetical characters and an opening round-bracket)
(<.*?>)| (?# non-greedily matches anything between brackets)
(\\)) (?# matches a closing round bracket)
请注意,我?从第 4 个模式中删除了运算符,该运算符奇怪地放在括号外,并且还捕获了空字符串。