Regular-Expression
正則表達式匹配沒有特定尾隨字元的特定字元串
這讓我難過
我有一個大型 C 源文件,其中包含一個必須始終添加到如下變數的變數:
CycleCounter += SomeValue
一些價值並不重要。
幾千行的源文件中的程式碼中有幾百行這樣的程式碼。我正在努力確保所有作業都被添加和意外分配或減去。
我想找到 CycleCounter 後面沒有“+”或一些空格和“+”的所有事件
我試過這個表達:
CycleCounter\s*[^+]
但在此範例中,它也匹配出現“+”的位置。
它也匹配案例 1,但我只希望它匹配沒有尾隨“+”的案例 2 和 3。
if (postbyte & 0x80) { switch (postbyte & 0x1F) { case 0: // Post inc by 1 ea = (*xfreg16[Register]); (*xfreg16[Register])++; CycleCounter+=NatEmuCycles21; // good. expression correctly ignored this break; case 1: // post in by 2 ea = (*xfreg16[Register]); (*xfreg16[Register]) += 2; CycleCounter += NatEmuCycles32; // good. expression incorrectly identified break; case 2: // pre dec by 1 (*xfreg16[Register]) -= 1; ea = (*xfreg16[Register]); CycleCounter -= NatEmuCycles21; // mistake, subtracted. expression correctly identified break; case 3: // pre dec by 2 (*xfreg16[Register]) -= 2; ea = (*xfreg16[Register]); CycleCounter = NatEmuCycles32; // mistake, assigned. expression correctly identified break; case 4: // no offset ea = (*xfreg16[Register]); break;
如果使用 Perl 兼容正則表達式 (PCRE),添加
+
after\s*
將貪婪地匹配零個以上[^+]
的空格,從而阻止匹配空格。例如。使用grep
with-P
來使用 PCRE(一個 GNU grep 選項)並-n
顯示行號:grep -Pn 'CycleCounter\s*+[^+]' file
另一個PCRE:
grep -Pn 'CycleCounter(?!\s*\+)' file
這次使用負前瞻來指定
not followed a '+' or some white space and a '+'
.您可以使用
sed
從輸出中刪除不需要的行:sed '/CycleCounter/!d; /CycleCounter[[:space:]]*+/d; =' file
刪除任何不包含 CycleCounter 的行,同時刪除任何包含 CycleCounter 後跟任何空格和“+”的行。
=
列印行號。