【问题标题】:Match all Inside Parenthesis but not Outside [duplicate]匹配所有内括号但不匹配外[重复]
【发布时间】:2014-02-24 03:19:46
【问题描述】:

我正在尝试使用正则表达式来匹配与函数相对应的某些字符串组。现在它看起来像这样:

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

它在哪里找到具有该函数作为属性的变量电子表格。表达式一直运行,直到到达括号末尾。对于简单的功能,例如

Spreadsheet.ADD(1,2)

正则表达式可以正常工作。

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

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

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

有谁对正则表达式有更多了解,知道如何更改它,使其仅在最后一个括号而不是第一个括号时停止?

谢谢。

【问题讨论】:

  • 这不是重复的,至少从我对您发布的问题的了解来看不是。我不想多次匹配我的表情。无论里面有多少个括号,我都想匹配我的表达式从开始括号到结束括号。
  • Spreadsheet.ADD(1, 2) + Spreadsheet.ADD(3, 4) 呢?
  • 部分输入由用户指定。此外,这些函数不仅仅是算术。嵌套是我想要的。

标签: javascript regex


【解决方案1】:

假设您只想以您在问题中陈述的形式匹配函数。如果您想匹配任何类型的函数(包括运算符、嵌套 cmets 等),那么您想要的内容将很难使用正则表达式,请参阅 here。无论如何,要匹配最后一个括号,您可以使用:

(Spreadsheet\..+\))

这将匹配

Spreadsheet.ADD(1,2)

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

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

(foo 不是匹配的一部分)

您的正则表达式与完整字符串不匹配的原因是,当它发现不是) 的字符(即第一个))时会停止。此外,顺便说一句,Spreadsheet. 将匹配SpreadsheetaSpreadsheetbSpreadsheetc。要匹配一个点,您需要\.

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

指定非贪婪匹配

【讨论】:

  • 非常感谢。这个表达正是我所需要的。我已经有了一种解析表达式以进行正确评估的方法,但是给定特定的用户输入,我不知道如何使用嵌套。这 \。是个好建议,因为 Spreadsheetb 会产生错误,尽管这不是通过用户输入提供的。 (用户键入“ADD(1,2)”,其余文本添加到后台。我确实知道正则表达式失败的原因,但我不知道如何调整它以获得正确的嵌套。跨度>
  • @NickFlekerFelker - 非常好,很乐意提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多