2013-08-23 37 views
1

我已在.NET中使用IgnoreCaseMultiline以下的正则表达式跳过文本

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

直接在像的例子,或者也''像textToFind这个'''?另外,如果上面的内容应该被忽略,那么''hello“textToFind”再见“''怎么办? – smerny

+0

嗯!好的@AustinSalonen!浅黄色..我看到你的评论越来越多的要求。我更新 – margabit

+0

更新我有充分的解释.. – margabit

回答

2

由于所有可能的情况都涉及混合引号集,因此正则表达式在这里可能不是您最好的选择。您可以改为做什么(在使用当前正则表达式筛选除引号之外的所有内容之后),请计算发生textToFind之前和之后的引号数。如果这两个数字都是奇数,那么您的关键字有引号,并且应该放弃该行。如果两者都是偶数,你在其他地方有匹配的引号(或者根本没有引号),并且应该保留该行。然后重复双引号的过程。你可以做所有这些只能穿过绳子一次。

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

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

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

+0

我编辑了我的问题。抱歉! – margabit

+0

编辑答案提供不同的(非正则表达式)的解决方案。最先没有获得最新的更新 - 还有一个不包括转义报价的附加问题,但是您应该能够相当容易地检测到这一点(例如,当您点击反斜杠时跳过下一个字符)。 – Michelle

+0

'notthefunc(“”);/*“*/myfunc(”“);' – JDB

1

看起来这应该在你给的所有例子中为您实际执行工作:

/\bmyFunc\(/ 

Demonstration - 视图控制台。

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

而且,看来你是VBScript代码内检查。 vbscript代码中的注释以'开头,对吧?你可以检查此为好,因为它看起来像你这样做是对线的基础上一条线,这应该对这些类型的评论工作:

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

Demo

+0

我可以在注释中看到对myFunc()的引用是一个完全有效的情况 – Michelle

+0

另一个问题是并非所有的方法在VBScript后跟一个'(',它是不是一个错误的答案,因为我没有在这个问题指明这一点。 – margabit

+0

@margabit啊,我从来没有在VBScript编程,实际上不得不寻找什么评论的样子。无论如何,你可以使用一个更简单的正则表达式(例如,只是'\ bmyFunc \ W')来过滤包含你正在查找的函数名称的行,然后从那里解析这些行以确保它们适合你的更复杂条件。 – smerny