2014-02-24 133 views
2

我试图使用正则表达式来匹配与函数对应的某些字符串组。现在看起来像这样:匹配所有内部圆括号但不是外部

(Spreadsheet.[^)\)]+\)) 

它在哪里找到变量Spreadsheet,它具有作为属性的功能。表达式继续前进直到到达结束圆括号。对于简单的功能,如

Spreadsheet.ADD(1,2) 

正则表达式将正常工作。

但是,如果我尝试进行任何类型的嵌套,则表达式不起作用,因为它将停止在内部圆括号而不是最后一个圆括号。

Spreadsheet.ADD(Spreadsheet.ADD(1, 2), 3) 

因此,“,3)”未被识别并且结束被忽略。当然,由于我的代码处理它的方式,这个不寻常的字符串最终导致错误。

有没有人有更多的正则表达知识知道如何改变它只会停在最后一个括号而不是第一个?

谢谢。

+1

这不是一个重复,至少不是我可以告诉你发布的问题。 我不想多次匹配我的表情。我想匹配我的表达从开始括号到结束括号,而不管内部有多少个括号。 –

+0

'Spreadsheet.ADD(1,2)+ Spreadsheet.ADD(3,4)'? – falsetru

+0

部分输入由用户指定。另外,这些功能不仅仅是算术。嵌套是我想要的东西。 –

回答

2

假设你只想匹配你在问题中陈述的形式的函数。如果你想匹配任何类型的函数(包括操作符,嵌套注释等),那么你想要的正则表达式会很困难,请参阅here。反正到最后括号匹配,您可以使用:

(Spreadsheet\..+\)) 

这将匹配

Spreadsheet.ADD(1,2)

Spreadsheet.ADD(Spreadsheet.ADD(1, 2), 3)

Spreadsheet.ADD(Spreadsheet.ADD(1, 2), 3)

(foo中而不是比赛的一部分)

您的正则表达式与完整字符串不匹配的原因是因为它会在发现不是)这是第一个)的字符时停止。此外,因为Spreadsheet.将匹配Spreadsheeta,Spreadsheetb,Spreadsheetc。要匹配你需要的点号\.

在我的正则表达式.+)将包括最后一个括号,因为+是贪婪的,所以它会得到最长的匹配。顺便说一下,你会指定一个非贪婪的匹配使用+?

+0

非常感谢。这个表达正是我需要的。我已经有一种解析表达式的方式来进行正确的评估,但是给定一个特定的用户输入,我不知道如何处理嵌套。 \ \。是很好的建议,因为Spreadsheetb会产生错误,尽管这不是通过用户输入提供的。 (用户键入“ADD(1,2)”,其余的文本在后台添加 我知道为什么正则表达式失败,但我不知道如何调整它以获得正确的嵌套。 –

+0

@NickFlekerFelker - 非常好,很乐意帮忙。 – acarlon