正则表达式混合案例排除特定案例

时间:2013-03-02 02:06:06

标签: regex regex-negation regex-lookarounds

我需要一个能够匹配的正则表达式:

  • a)某个单词的大/小写的所有组合
  • b)除了几个特定的​​案例组合。

我必须搜索bash成千上万的源代码文件,拼写错误的变量。

具体来说,我正在搜索的单词是FrontEnd,在我们的编码风格指南中,可以根据具体情况以两种方式编写:

FrontEnd (F and E upper)
frontend (all lower)

所以我需要“捕捉”任何不符合我们编码标准的事件:

frontEnd
FRONTEND
fRonTenD

我一直在阅读这个特定示例的许多正则表达式教程,我找不到一种方法来说“匹配这个模式但是如果它恰好是这个或另一个那么就不匹配”。

我想这类似于尝试匹配“000000到999999之间的任何数字,除了数字555555或数字123456”,我认为逻辑是相似的(当然我也不打算这样做) :))

日Thnx


补充评论:

我无法使用grep管道grep -v,因为我可能会错过线条;例如,如果我这样做:

grep -i frontend | grep -v FrontEnd | grep -v frontend

会错过这样的一行:

if( frontEnd.name == 'hello' || FrontEnd.value == 3 )

因为第二次出现会隐藏整条线。因此,我正在寻找一个与egrep一起使用的正则表达式,能够完成我需要的完全匹配。

2 个答案:

答案 0 :(得分:1)

您无法使用egrep轻松完成此操作,因为它不支持前瞻。使用perl可能最容易做到这一点。

perl -ne 'print if /(?!frontend|FrontEnd)(?i)frontend/;'

使用stdin

来管道文本

这是如何运作的:

perl -ne 'print if /(?!frontend|FrontEnd)(?i)frontend/;'
^     ^^  ^     ^  ^ ^ ^                 ^   ^ The pattern that matches both the correct and incorrect versions.
|     ||  |     |  | | |                 | This switch turns on case insensitive matching for the rest of the regular expression (use (?-i) to turn it off) (perl specific)
|     ||  |     |  | | | The pattern that match the correct versions.
|     ||  |     |  | | Negative forward look ahead, ensures that the good stuff won't be matched
|     ||  |     |  | Begin regular expression match, returns true if match
|     ||  |     | Begin if statement, this expression uses perl's reverse if semantics (expression1 if expression2;)
|     ||  | Print content of $_, which is piped in by -n flag
|     || Evaluate perl code from command line
|     | Wrap code in while (<>) { } takes each line from stdin and puts it in $_
| Perl command, love it or hate it.

答案 1 :(得分:0)

这确实应该是评论,但是有什么理由你不能使用sed吗?我在想像

sed 's/frontend/FrontEnd/ig' input.txt

当然,假设您想要更正不正确的版本......