2014-04-15 17 views
5

Tôi muốn để phù hợp với một dòng có chứa một từ, nhưng không có dấu chấm phẩy trong đóphù hợp với một dòng sử dụng bash regex

này phải phù hợp:

class test 

này không phải phù hợp với

class test; 

này không phải phù hợp với một trong hai

class test; // test class 

đây là những gì tôi đã mong đợi để làm việc, nhưng nó không:

pattern="class [^;]*" 

if [[ $line =~ $pattern ]] 

nhờ

+1

Điều gì về 'lớp kiểm tra // lớp kiểm tra;'? –

+0

Không chỉnh sửa câu hỏi này với câu hỏi mới của bạn hoặc xóa chi tiết khỏi câu hỏi này có câu trả lời. Sử dụng nút [Hỏi câu hỏi] (http://stackoverflow.com/questions/ask) và đăng câu hỏi mới cung cấp [tất cả các chi tiết cần thiết để nhận câu trả lời của bạn] (http://stackoverflow.com/help/how- yêu cầu) – Taryn

Trả lời

0

Sử dụng ^[^;]+($|\s*//). Điều này có nghĩa là bất kỳ số ký tự không dấu chấm phẩy nào (ít nhất một) từ đầu chuỗi cho đến khi kết thúc của dòng hoặc bất kỳ số dấu cách nào sau hai dấu gạch chéo.

http://rubular.com/r/HTizIXz2HA

0

tôi nghĩ rằng bạn cần:

pattern="^[^;]*class [^;]*$"` 

Điều này đảm bảo dòng không có; trước hoặc sau trận đấu [^;]* của bạn.

1

thế nào về thẳng thắn:

pattern="^[^;]*\bclass\b[^;]*$" 

\b từ ranh giới đã được bổ sung, chỉ phù hợp với xxx class xxx, không phù hợp với superclass xxx

3

biểu hiện thường xuyên của bạn không phải là anchored có nghĩa là [^;]* vẫn sẽ phù hợp với tất cả các nhân vật lên cho một số ; có thể có (và do đó khớp với toàn bộ). Nếu bạn neo regex so với cuối dòng ([^;]*$) nó sẽ tạo ra những kết quả mà bạn đang theo đuổi:

$ cat t.sh 
#!/bin/bash 

pattern='class [^;]*$' 
while read -r line; do 
    printf "testing '${line}': " 
    [[ $line =~ $pattern ]] && echo matches || echo "doesn't match" 
done <<EOT 
class test 
class test; 
class test; // test class 
EOT 

$ ./t.sh 
testing 'class test': matches 
testing 'class test;': doesn't match 
testing 'class test; // test class': doesn't match 

TL; DR: Nói cách khác, phần in đậm trong

kiểm tra lớp; foo bar quux

khớp với regex của bạn mặc dù chuỗi chứa dấu chấm phẩy là lý do tại sao nó luôn khớp. Neo đảm bảo rằng cụm từ thông dụng chỉ khớp với nhau nếu không có dấu chấm phẩy cho đến khi kết thúc của chuỗi.

+0

Công trình này tuyệt vời, cảm ơn rất nhiều – ewrgq3er

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