2012-06-10 22 views
5

我試圖運行一些代碼文件並找到不以分號結尾的行。正則表達式檢測一行是否不以分號結尾

我目前有這樣的:^(?:(?!;).)*$從一堆谷歌搜索,它工作得很好。但是現在我想擴展它,所以它忽略了開始處的所有空白或特定的關鍵字,如包或開始和結束花括號。

的最終目標是要採取這樣的:

package example 
{ 
    public class Example 
    { 
     var i = 0 

     var j = 1; 

     // other functions and stuff 
    } 
} 

而且該模式給我var i = 0缺少一個分號。這只是一個例子,缺少的分號可能在課堂上的任何地方。

任何想法?我已經擺弄了一個多小時,但沒有運氣。

謝謝。

+0

「發現不繫以分號結尾。「 - 您的正則表達式查找任何地方不包含分號的行。你要哪個? –

+0

對不起,我發現與谷歌搜索,真的很難找到正則表達式的東西不存在的例子。我更喜歡一個不以分號結尾的行(不包括任何換行符或末尾的內容)。 – Bruce

+0

忽略-1並給我的答案一試。它應該工作,這取決於你正在使用哪個正則表達式引擎。唯一可能的粘滯點將是後視鏡中的。*。並非每個正則表達式引擎都支持無限重複。 – JDB

回答

1

試試這個:

^\s*(?!package|public|class|//|[{}]).*(?<!;\s*)$ 

當在PowerShell中進行了測試:

PS> (gc file.txt) -match '^\s*(?!package|public|class|//|[{}]).*(?<!;\s*)$' 
     var i = 0 
PS> 
0

對於不以分號結束只是線,這是簡單的:

.*[^;]$ 

如果你不想開始的行空白,並與分號結尾:

^[^ ].*[^;]$ 
+1

這兩個都可以找到每一行代碼。 :( – Bruce

+0

模式'[^;] $'應該足以找到最後一個字符不是分號的行 – tchrist

1

如果你想要一個不以分號結尾的行,你可以要求任何數量的任何數字.*後跟一個不是分號的字符[^;]後面可能有一些空格\s*在行尾$。所以,你必須:

.*[^;]\s*$ 

現在,如果你不想在一開始的空白,你需要問之後,是不是空白[^\s]其次是正則表達式從早期的任何字符行^的開頭:

^[^\s].*[^;]\s*$ 

如果你不希望它開始像package或者說,class關鍵字,或空格,你可以問一個字,是不是任何的這三樣東西。匹配這三種東西中的任何一種的正則表達式是(?:\s|package|class),匹配其他任何東西的正則表達式是(?!\s|package|class)。請注意0​​。所以,你現在有:

^(?!\s|package|class).*[^;]\s*$ 
+0

沒有骰子您的第一個示例查找我的代碼的每一行,第二個示例只查找具有零空白的行在他們之前,這些都是我的'package x'語句。 – Bruce

+0

你想匹配以空白開頭的行,但沒有選擇空格? –

+0

關於匹配每一行,嘗試將結尾更改爲'[[;;] \ s * $',它檢查字符串末尾是否有帶空格的分號(如回車符)。 –

0

您嘗試匹配可能與空白^\s*開頭的行,則沒有特定的一組單詞,例如(?!package|class),那麼有什麼.*但當時還沒有結束用分號(或其後有空格的分號)[^;]\s*

^\s*(?!package|class).*?[^;]\s*$ 

請注意,我在正則表達式的一部分周圍添加了括號。

+0

我感謝所有的幫助。這絕對是最接近的,但它仍然找到以分號結尾的行。只是爲了表明我不拖拉你或什麼:http://i.imgur.com/h8zwi.png – Bruce

+0

哦,我明白你現在要做的事情!我簡化了一下,應該相當。我也做了一點改動,因爲我意識到它可以使空白字符成爲不是分號,並在任何字符中包含分號。 –

+0

我做的改變是用'。*?'替換'。*',其中說「匹配我足夠的任何東西來匹配,但不超過你需要」。所以它不會吞下分號。 –

1

在正則表達式捕捉這個複雜的概念,關鍵是要首先了解你的正則表達式引擎/解釋器是如何處理以下概念:

  1. 正向前查找
  2. 負先行
  3. 正回顧後
  4. 否定後視

然後你就可以開始說話了d如何捕捉你想要的東西,但只有在前面和後面的東西完全如你所述的情況下。

str.scan(/^\s*(?=\S)(?!package.+\n|public.+\n|\/\/|\{|\})(.+)(?<!;)\s*$/) 
0

這是我使用突出的Java代碼沒有結尾的行正則表達式行在分號中,並不是在java中最後不應該有分號的行......使用vim的正則表達式引擎。

\(.\+[^; ]$\)\(^.*public.*\|.*//.*\|.*interface.*\|.*for.*\|.*class.*\|.*try.*\|^\s*if\s\+.*\|.*private.*\|.*new.*\|.*else.*\|.*while.*\|.*protected.*$\)\@<! 
^  ^                                  ^
    |   |                             negative lookbehind feature 
    |   | 
    |   2. But not where such matches are preceeded by these keywords 
    | 
    | 
    1. Group of at least some anychar preceeding a missing semicolon 

助記符破譯字形:

^   beginning of line 
.*   Any amount of any char 
+   at least one 
[^ ... ] everything but 
$   end of line 
\(... \) group 
\|   delimiter 
\@<!  negative lookbehind 

大致翻譯到:

找到我,不以分號結束,沒有任何上述關鍵字的所有行/表達式在它的左邊。它不是完美的,可能不支持混淆java,但對於簡單的java程序,它突出顯示最後應該有分號的行,但不要。

圖像顯示瞭如何表達出來工作對我來說:

enter image description here

有用的鏈接,幫助我得到的概念,我需要:

https://jbodah.github.io/blog/2016/11/01/positivenegative-lookaheadlookbehind-vim/

相關問題