需要在java中使用正则表达式解析句子

时间:2013-03-07 09:23:26

标签: java regex

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

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

我想要有令牌,如:

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

实体和资产有&lt;&gt;在它们周围,Action后跟“(”。但是,“)”是一个独立的标记。 我使用以下内容:

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

但它无法将")"显示为令牌?我做错了什么?

3 个答案:

答案 0 :(得分:1)

试试这个正则表达式:

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

答案 1 :(得分:0)

这适用于您的示例:

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

fiddle.re online demo

答案 2 :(得分: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)

由于|运算符从不贪婪,因此在您实际需要的第4个模式之前触发第三个模式(匹配空字符串)。

证明这是你用正则表达式实际获得的标记是:

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