在正则表达式中引用引号之间的文本

时间:2013-08-23 13:11:30

标签: c# regex

我在.NET中使用IgnoreCaseMultiline使用以下正则表达式:

^.*?\WtextToFind\W.*?$

给出如下的多行输入:

1 Some Random Text textToFind
2 Some more "textToFind" random text 
3 Another textToFinddd random text

当前正则表达式与第1行和第2行匹配。但是我需要跳过textToFind在引号和双引号内的所有行。

任何想法如何实现这一目标?

谢谢!

修改

说明:我的目的是在VBScript代码中找到一些方法调用。我认为这与我的问题无关,但在阅读完评论后,我意识到我应该解释一下。

所以基本上我想跳过引号或单引号之间的文本以及引号和行尾之间的所有文本,因为这将是VBScript中的注释: 如果我正在寻找myFunc

Call myFunc("parameter") // should match
Call anotherFunc("myFunc") //should not match
Call someFunc("parameter") 'Comment myFunc //should not match
If(myFunc("parameter") And someFunc("myFunc")) //should match

2 个答案:

答案 0 :(得分:2)

对于涉及混合报价集的所有可能情况,正则表达式可能不是您的最佳选择。您可以做什么(在使用当前的正则表达式来过滤除引号之外的所有内容之后),计算textToFind出现之前和之后的引号数。如果两个计数都是奇数,那么您的关键字周围有引号,应该废弃该行。如果两者都是偶数,那么你在其他地方有匹配的引号(或根本没有引号),并且应该保持该行。然后重复双引号的过程。你可以完成所有这一切,只需要穿过字符串一次。

编辑以解决您正在搜索代码的更新: 还需要考虑一些其他注意事项。

  • 转义引号(在转义字符后跳过字符,不会计算)。
  • 评论引用,例如/* " */位于一条线的中间。当您点击/*时,只需跳转到下一个*/,然后继续检查字符。您可能还想检查textToFind的出现是否在评论中。
  • 行尾'引号 - 如果在关键字之前发生(在文字字符串之外),则它不是有效的方法调用。

底线仍然是正则表达式不是你正在寻找的机器人,在这里。你最好穿过线条并解析它们。

答案 1 :(得分:1)

在您给出的所有示例中,这似乎适用于您的实际实现:

/\bmyFunc\(/

Demonstration - 查看控制台。

只要你没有像"i'm going to call myFunc()"这样的东西,但如果你开始尝试处理引号,多引号,嵌套引号等等......它会变得非常混乱(like trying to parse dom with regex)

此外,您似乎正在检查vbscript代码。 vbscript代码中的注释以'开头,对吧?您也可以检查这一点,因为看起来您是逐行执行此操作,这应该适用于那些类型的注释:

/^\s*[^'].*\bmyFunc\(/

Demo