2012-06-10 34 views
5

Tôi đang cố gắng chạy qua một số tệp mã và tìm các dòng không kết thúc bằng dấu chấm phẩy.RegEx để phát hiện nếu một dòng không kết thúc bằng dấu chấm phẩy

Tôi hiện có: ^(?:(?!;).)*$ từ một nhóm Googling và nó hoạt động tốt. Nhưng bây giờ tôi muốn mở rộng trên nó để nó bỏ qua tất cả các khoảng trống ở đầu hoặc từ khóa cụ thể như gói hoặc mở và đóng niềng răng.

Mục tiêu cuối cùng là để có một cái gì đó như thế này:

package example 
{ 
    public class Example 
    { 
     var i = 0 

     var j = 1; 

     // other functions and stuff 
    } 
} 

Và đối với các mô hình để chỉ cho tôi var i = 0 thiếu Dấu chấm phẩy. Đó chỉ là một ví dụ, đại tràng bán mất tích có thể ở bất kỳ đâu trong lớp.

Bất kỳ ý tưởng nào? Tôi đã không quan tâm trong hơn một giờ nhưng không may mắn.

Cảm ơn.

+0

"tìm đường mà không làm kết thúc bằng dấu chấm phẩy. " - Cụm từ thông dụng của bạn tìm các dòng không chứa dấu chấm phẩy ở bất kỳ đâu. Bạn muốn cái nào –

+0

Xin lỗi những gì tôi đã tìm thấy với Googling, thật khó để tìm thấy các ví dụ về regex để tìm kiếm những thứ không tồn tại. Tôi muốn một dòng mà không kết thúc bằng một dấu chấm phẩy (không bao gồm bất kỳ dòng mới hoặc một cái gì đó ở cuối). – Bruce

+0

Bỏ qua -1 và trả lời câu trả lời của tôi. Nó sẽ hoạt động, tùy thuộc vào công cụ regex bạn đang sử dụng. Điểm dính duy nhất có thể là. * Trong vẻ ngoài. Không phải mọi động cơ regex đều hỗ trợ sự lặp lại không bị ràng buộc trong một sự thay đổi. – JDB

Trả lời

1

Hãy thử điều này:

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

Khi thử nghiệm trong PowerShell:

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

Đối với chỉ đường mà không kết thúc bằng một dấu chấm phẩy, đây là đơn giản:

.*[^;]$ 

Nếu bạn không muốn dòng bắt đầu bằng khoảng trắng và kết thúc với dấu chấm phẩy:

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

Cả hai đều tìm thấy mọi dòng mã. :( – Bruce

+0

Mẫu '[^;] $' sẽ đủ để tìm các dòng có ký tự cuối cùng không phải là dấu chấm phẩy. – tchrist

1

Nếu bạn muốn một dòng không kết thúc bằng dấu chấm phẩy bạn có thể yêu cầu bất kỳ số tiền nào .* theo sau bởi một ký tự không phải là dấu chấm phẩy [^;] theo sau có thể là khoảng trắng \s* ở cuối dòng $. Vì vậy, bạn có:

.*[^;]\s*$ 

Bây giờ nếu bạn không muốn trắng ngay từ đầu bạn cần phải hỏi cho sự khởi đầu của dòng ^ tiếp theo bất kỳ nhân vật đó không phải là khoảng trắng [^\s] tiếp theo là regex từ trước đó:

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

Nếu bạn không muốn nó bắt đầu với một từ khóa như package hoặc, nói, class, hoặc khoảng trắng, bạn có thể yêu cầu một nhân vật đó không phải là bất kỳ của những ba điều. Các regex phù hợp với bất kỳ của ba điều đó là (?:\s|package|class) và regex phù hợp với bất cứ điều gì ngoại trừ chúng là (?!\s|package|class). Lưu ý !. Vì vậy, bây giờ bạn có:

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

Ví dụ đầu tiên của bạn tìm thấy mọi dòng mã của tôi và ví dụ thứ hai của bạn chỉ tìm thấy các dòng có khoảng trống bằng 0 trước chúng, đó là tất cả các câu lệnh 'gói x' của tôi. – Bruce

+0

Bạn muốn khớp với các dòng bắt đầu bằng khoảng trắng nhưng không nhận được khoảng trắng? –

+0

Về mỗi dòng phù hợp, hãy thử thay đổi kết thúc thành '[^;] \ s * $' để kiểm tra xem có dấu chấm phẩy có khoảng trắng (như trả về vận chuyển) ở cuối chuỗi hay không. –

0

Bạn đang cố gắng để phù hợp với dòng mà có thể bắt đầu với khoảng trắng ^\s*, sau đó không có một tập hợp các từ, ví dụ (?!package|class), sau đó có bất cứ điều gì .* nhưng sau đó không kết thúc trong dấu chấm phẩy (hoặc dấu chấm phẩy có khoảng trống sau dấu chấm phẩy) [^;]\s*.

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

Lưu ý rằng tôi đã thêm dấu ngoặc đơn quanh một phần của regex.

+0

Tôi đánh giá cao tất cả sự trợ giúp. Điều này chắc chắn là gần nhất, nhưng nó vẫn đang tìm các dòng kết thúc bằng dấu chấm phẩy. Chỉ để cho thấy tôi không trolling bạn hoặc một cái gì đó: http://i.imgur.com/h8zwi.png – Bruce

+0

Oh tôi thấy những gì bạn đang cố gắng làm ngay bây giờ! Tôi đơn giản hóa nó một chút, nên tương đương. Tôi cũng thực hiện một thay đổi nhỏ bởi vì tôi nhận ra rằng nó có thể làm cho một nhân vật khoảng trắng là một dấu chấm phẩy và bao gồm dấu chấm phẩy trong bất kỳ ký tự nào. –

+0

Thay đổi tôi đã thực hiện là thay thế '. *' Bằng '. *?' Cho biết "khớp với tôi đủ thứ để khớp, nhưng không nhiều hơn bạn cần". Vì vậy, nó sẽ không nuốt dấu chấm phẩy. –

1

Chìa khóa để nắm bắt khái niệm phức tạp này trong regex là trước hết phải hiểu như thế nào biểu hiện thường xuyên của bạn động cơ/phiên dịch xử lý các khái niệm sau:

  1. dương lookahead
  2. lookahead tiêu cực
  3. lookbehind dương
  4. lookbehind tiêu cực

Sau đó, bạn có thể bắt đầu understan d làm thế nào để nắm bắt những gì bạn muốn, nhưng chỉ trong trường hợp như vậy, nơi những gì đang ở phía trước và những gì đằng sau là chính xác như bạn chỉ định.

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

Đây là dòng biểu thức chính quy Tôi đang sử dụng để làm nổi bật dòng mã Java mà không kết thúc trong dấu chấm phẩy và không phải là một trong những dòng trong java mà không phải có dấu chấm phẩy ở cuối ... bằng cách sử dụng công cụ biểu thức chính quy của 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 

thuật nhớ cho glyphs giải mã:

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

nào nôm na là:

Find me tất cả các dòng mà không kết thúc bằng một dấu chấm phẩy và không có bất kỳ các từ khóa trên/biểu thức ở bên trái của nó. Nó không hoàn hảo và có thể không nắm giữ java bị xáo trộn, nhưng đối với các chương trình java đơn giản, nó làm nổi bật các dòng cần có dấu chấm phẩy ở cuối, nhưng không.

Hình ảnh cho thấy cách biểu hiện này đang làm việc ra cho tôi:

enter image description here

liên kết hữu ích đó đã giúp tôi có được những khái niệm tôi cần:

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

Các vấn đề liên quan