3

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

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

我必须搜索bash数千个源代码文件,出现拼写错误的变量。

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

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

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

frontEnd
FRONTEND
fRonTenD

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

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

谢谢


附加评论:

我不能使用greppiped to,grep -v因为我可能会错过线路;例如,如果我这样做:

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

会错过这样的一行:

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

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

4

2 回答 2

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.
于 2013-03-02T02:38:23.513 回答
0

这真的应该是一个评论,但你有什么理由不能使用sed吗?我在想类似的东西

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

也就是说,当然,假设您要更正不正常的版本......

于 2013-03-02T02:23:06.893 回答