【问题标题】:Matching function arguments using regex使用正则表达式匹配函数参数
【发布时间】:2014-07-18 14:38:10
【问题描述】:

我有一些调用函数的混淆代码,如下所示:

getAny([["text with symbols \"()[],.;\" and maybe 'ImVerySeriousFn'"], ...]);
setAny([["other text with \"()[],.;\""], ...]);...

参数包含随机文本。函数相互跟随,没有换行。

如何使用正则表达式集获取getAnysetAny 和其他函数的参数?

我需要这个结果:

regex1 result: [["text with symbols \"()[],.;\" and maybe 'ImVerySeriousFn'"], ...]
regex2 result: [["other text with \"()[],.;\""], ...]
...

我试着写regex1:

getAny\((.*)\)

但匹配结果中也包含setAny调用

 [["text with symbols \"()[],.;\" and maybe 'ImVerySeriousFn'"], ...]);setAny([["other text with \"()[],.;\""], ...]

当我尝试时:

getAny\((.*?)\)

匹配结果中断参数字符串

[["text with symbols \"(

我不能按;); 进行拆分,因为参数中的文本可以包含符号;);

使用正则表达式可能无法做到这一点?

【问题讨论】:

  • 解析器可能是更好的方法,但是this?:[gs]etAny\((.*)\)
  • 不幸的是,函数相互跟随,没有换行。 [gs]etAny\((.*)\) - it does not work.

标签: regex


【解决方案1】:

你的正则表达式必须是\(.*?\);,因为你的代码被混淆了(并且假设在一行上)。

请注意,如果您的参数之一在其中包含 );,这将失败。

解释(来自 Regex101.com):

/\((.*?)\);/g
  \( matches the character ( literally
    1st Capturing group (.*?)
      .*? matches any character (except newline)
      Quantifier: Between zero and unlimited times, as few times as possible, expanding as needed [lazy]
  \) matches the character ) literally
  ; matches the character ; literally
  g modifier: global. All matches (don't return on first match)

您的正则表达式的主要问题是您从未指定; 来结束一场比赛,所以它继续并抓住了它看到的最后一个),因为您使用了.*,这是贪婪的(抓住一切) 除非后面跟着?

Demo

【讨论】:

  • 您假设逗号将始终存在。我认为 OP 添加了标点符号以表明两者之间可能存在“特殊”字符,这不应该导致正则表达式失败,并且 not 作为参数分隔符。
  • @AmalMurali 已修复。此外,如果您查看他的输入,逗号也被用作参数分隔符。
  • 换种说法:我认为(?:.+,)*? 在这里没用,因为最后的.+ 是在做所有匹配。
  • 感谢您的回答——尽管有下面的评论,但它没有提供足够的解释来说明它的作用以及它为什么解决了 OP 的问题。你能解释清楚吗?
  • @EngineerDollery 很抱歉用 cmets 向您的收件箱发送垃圾邮件,但是在阅读了这两个链接之后,我看不出这不符合准则。根据“如何回答”,我想我可以通过为链接添加一些上下文来解决这个问题,例如“Here is a demo of the regex in action on Regex101.com”,但我不知道这是否会满足我显然错过的要求。
【解决方案2】:

我不知道,如果我理解你的问题,但如果我理解了,你也许可以使用一个组并收集其中允许的标志。

您的正则表达式可能是:\( ( ) " [ ],\.; a-zA-Z \)

外括号将组括起来

【讨论】:

    【解决方案3】:

    如果我正确理解您的模式,您的函数参数将始终以 [[" 开头并以 "]] 结尾。

    正则表达式:

    /getAny\((\[\[".*?[^\\]"\]\])\);/
    

    演示:http://regex101.com/r/jC3vX5/2

    注意懒惰的.*?[^\\] 以确保匹配的引号不会被转义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      • 2017-12-01
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多