【问题标题】:Parse formula name and arguments with regex [duplicate]使用正则表达式解析公式名称和参数 [重复]
【发布时间】:2016-04-11 23:53:40
【问题描述】:

this Regex(\w*)\s*\([(\w*),]*\) 的目标是获取函数名及其参数。

例如,给定f1 (11,22,33)

正则表达式应该包含四个元素:

f1 11 22 33

这个正则表达式有什么问题?

【问题讨论】:

  • 您似乎正在为参数捕获空格。看起来这个正则表达式可以捕获作为参数的逗号列表,因为(\w*) 甚至会指示零长度序列(空格)。并且这里函数的最后一个参数需要跟一个逗号;您可能需要为最后一个参数添加一个单独的组。
  • 您不能在[] 中使用特殊字符。另外,不要为此使用正则表达式
  • 我怀疑你可以在字符集中使用分组括号。
  • @hop:您可以使用特殊字符,但您可能不能使用分组。括号只是采用与预期不同的值,但\w(一个特殊字符)确实有效。
  • @Evert:是的,就像劈头发一样会解决这个问题。

标签: regex


【解决方案1】:

您可以使用split 来做到这一点这是javascript 中的一个示例

var ar = str.match(/\((.*?)\)/);
if (ar) {
  var result = ar[0].split(",");
}

参考:https://stackoverflow.com/a/13953005/1827594

【讨论】:

【解决方案2】:

有些事情对正则表达式来说很难:-)

正如上面的评论者所说,“*”可能过于宽松。这意味着零或更多。所以foo(,,) 也匹配。不太好。

(\w+)\s*\((\w+)(?:,\s*(\w+)\s*)*\)

这更接近你想要的我的想法。让我们分解一下。

\w+   <-- The function name, has to have at least one character
\s*   <-- zero or more whitespace
\(    <-- parens to start the function call
(\w+) <-- at least one parameter
(?:)  <-- this means not to save the matches
,\s*  <-- a comma with optional space
(\w+) <-- another parameter
\s*   <-- followed by optional space

这是 Python 的结果:

>>> m = re.match(r'(\w+)\s*\((\w+)(?:,\s*(\w+)\s*)*\)', "foo(a,b,c)")
>>> m.groups()
('foo', 'a', 'c')

但是,像这样的事情呢:

foo(a,b,c
    d,e,f)

??是的,使用正则表达式会很快变得困难,您可以使用更丰富的解析工具。

【讨论】:

  • 您的正则表达式有问题,请参阅regex101.com/r/pX0nQ6/5
  • 是的,在回家之前尝试回答问题的乐趣。
  • 您可以在运行正则表达式之前消除任何新行和多余的空格
  • 有时。取决于语法、cmets 等。如果它们在每个参数之后嵌入 cmets,而不仅仅是折叠换行符将不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-29
  • 2015-07-16
  • 2018-04-29
  • 1970-01-01
  • 2012-11-30
相关资源
最近更新 更多