4

我想为以下内容提出一个正则表达式:

<action>::=Action(<entity><entity><Asset>)

我想要令牌,例如:

Action(
<entity>
<entity>
<Asset>
)

entity和asset周围有<>,Action后面跟着“(”。但是,“)”是一个独立的token。我正在使用以下内容:

([a-zA-Z]+\\()|((<.*?>)|([a-zA-Z]*))|(\\))?

但它没有显示")"作为令牌?我究竟做错了什么?

4

3 回答 3

1

试试这个正则表达式:

([a-zA-Z]*\\()|(<[a-zA-Z]*>)|(\\))
于 2013-03-07T09:33:46.920 回答
0

这应该适用于您的示例:

(\\w+\\()(<\\w+?>)(<\\w+?>)(<\\w+?>)(\\))

fiddle.re 在线演示

于 2013-03-07T09:35:59.133 回答
0

您的正则表达式实际上有问题,或者至少它使表达式以一种意想不到的方式表现(对我来说)。

表达式可以这样分解:

([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 个模式中删除了运算符,该运算符奇怪地放在括号外,并且还捕获了空字符串。

于 2013-03-07T10:55:21.647 回答