【发布时间】:2013-10-19 22:03:35
【问题描述】:
我想要一个正则表达式来查找任何给定的字符串,但前提是它没有用单行 cmets 注释。
如果它在多行 cmets 内,我不介意它是否找到字符串(因为除此之外我认为 Regex 会更加复杂)。
一个例子,假设我想要“mystring”(不带引号):
mystring bla bla bla <-- should find this
bla bla mystring bla <-- also this
// bla bla mystring <-- not this , because is already commented
//mystring <-- not this
// alkdfjñas askfjña bla bla mystring <-- not this
wsfier mystring añljkfasñf <--should find this
mystring //a comment <-- should find this
bla bla // asfsdf mystring <-- should SKIP this, because mystring is commented
/*
asdfasf
mystring <-- i dont care if it finds this, even if it is inside a block comment
añfkjañsflk
// aksañl mystring <-- but should skip this, because the single line is already commented with '//' (regardless the block comment)
añskfjñas
asdasf
*/
换句话说,我只想查找 mystring 尚未用“//”注释的情况,即单行 cmets。 (同样,我不关心多行 cmets)。
谢谢!
更新,我找到了一个简单的答案,并且比下面接受的答案更容易理解(无论如何也可以)。
就这么简单:^([^//]*)mystring
因为我不在乎我是否只匹配“mystring”,或者它之前的所有内容,所以更简单的正则表达式可以完美地工作。 对于我需要的东西,它是完美的,因为我只需要使用未注释的字符串(不一定是确切的字符串)物理定位 LINES,然后对它们进行注释,并且由于我的编辑器(Notepad++)允许我使用简单的快捷方式来注释/取消注释(Ctrl+Q),我只需要搜索带有正则表达式的行,在它们之间跳转(使用 F3),然后按 Ctrl+Q 来评论它们,如果我仍然需要它们,可以保留它们。
【问题讨论】:
-
任何尝试解决这个问题了吗?
-
不,我想我必须使用“lookbehinds”,但我不知道具体如何。
-
@DiegoDD 好好阅读。试试看。在这里报告结果/问题。
-
尝试了
(?<!\/\/)mystring,但只排除了//mystring,而不是//blablamystring。尝试了(?<!\/\/[.]*)mystring,但排除了所有内容。还有(?<!\/\/)[.]*(mystring),但不符合我的需要。我错过了告诉它考虑//和mystring之间的任何内容的部分,因此它将排除// bla bla mystring。 here 是我的尝试。 -
有没有考虑过使用递归PCRE,先排除cmets (prestosoft.com/ps.asp?page=htmlhelp/edp/ignore_comments_options),再匹配字符串?