2010-10-19 58 views
5

Làm thế nào để nói, trong biểu thức thông thường:Trợ giúp Với Regular Expression đặc biệt - Không Chứa Một số chuỗi

Bất kỳ phần nào của một chuỗi bắt đầu bằng một chữ cái viết hoa, có chứa ít nhất một ký tự không gian, không chứa chuỗi
" _ " (khoảng trắng dấu gạch dưới) và kết thúc bằng chuỗi "!!!" (không có dấu ngoặc kép)?

Tôi đang gặp sự cố với phần "không chứa".

Dưới đây là những gì tôi có cho đến nay:

[A-Z].* .*!!! 

Làm thế nào để tôi sửa đổi này để cũng xác định "Không chứa '_'"?

Nó không cần phải là chuỗi cụ thể "_". Làm thế nào tôi có thể nói "không chứa" chuỗi ANY? Ví dụ: không chứa "chó"?

Sửa: Tôi muốn giải pháp cho phù hợp với "preg_replace" Php của

Sửa: Ví dụ:

Ví dụ cho "_":

Abc xyz !!! < --- Kết quả phù hợp

Xin chào thế giới !!! < --- Kết quả phù hợp

Có _ Space Space! < --- Không Tương Xứng

Ví dụ cho "con chó":

gì một con chó !!! < --- Không khớp, (chứa "chó")

Xin chào thế giới !!! < --- Kết quả phù hợp

+4

Xin chào, những gì ngôn ngữ bạn đang sử dụng? Perl Reg.exps? ECMAScript? – Benoit

+0

Bạn có thể đăng một vài ví dụ về các chuỗi hợp lệ/không hợp lệ không? – Kobi

Trả lời

2

Khái niệm x(?!y) phù hợp x chỉ khi nó không phải là ngay lập tức sau đó y. Vì vậy, điều này có vẻ là điều bạn muốn:

[A-Z](?!%s)(.(?!%s))* (.(?!%s))*!!! 

Trường hợp này là chuỗi bị cấm của bạn.

1

Bất kỳ regex nào có thể cho điều này có thể phức tạp hơn nhiều so với hai regex. Giống như của bạn: [A-Z].* .*!!! và thứ hai được áp dụng trên các chuỗi phù hợp và kiểm tra xem có _ không.

+0

Thật không may, tôi cần phải "nắm bắt" phần phù hợp của chuỗi, vì vậy tôi yêu cầu một regex duy nhất cho nó. – Joshua

0

Bắt đầu với Bất kỳ vốn nào; có một chuỗi tùy chọn của tất cả mọi thứ trừ một dấu gạch dưới, một dấu cách, và sau đó tất cả mọi thứ ngoại trừ gạch dưới một lần nữa, theo sau là ba dấu chấm than.

[A-Z][^_]*[ ][^_]*!!! 
+0

Sẽ không khớp với 'Abc_d ef !!! ' – Benoit

+0

Làm cách nào để áp dụng điều này trong trường hợp ví dụ" con chó ", trong bản chỉnh sửa ở trên? – Joshua

0

Đầu tiên kiểm tra chuỗi của bạn cho bất kỳ sự xuất hiện của "_", vì đó là một không phù hợp. Sau đó kiểm tra những gì bạn muốn.

Đó là những gì tôi sẽ làm thay vì dành nhiều thời gian cố gắng tìm ra một biểu thức chính quy cho nó.

Đây là một trang web đẹp để thử nghiệm biểu của bạn: Nregex

Sửa: Tôi đọc một số chi tiết về câu hỏi của bạn và thấy rằng câu trả lời của tôi là không thực sự tốt, vì vậy đây là nỗ lực khác. Một sửa đổi của một trong các biểu thức trên:

[A-Z](?! _)(\w(?! _))* (\w(?! _))*!!! 
0
[A-Z]([^ ]*(?! _) ?)*!!! 

Edit: tôi đã bỏ lỡ yêu cầu của bạn cho ít nhất một không gian. Regex dưới đây bao gồm mà yêu cầu:

[A-Z][^ ]* (?!_)((?! _).)*!!! 
0

tôi sử dụng để giải quyết nó qua -v tùy chọn grep 's (nếu tôi trên Linux và/hoặc có thể sử dụng grep).

Vì vậy, hãy tìm kiếm thứ gì đó, sau đó bỏ qua các phần không quan tâm.

grep something <INPUT> | grep -v uninteresting 

Without grep (chết tiệt cửa sổ, không có quyền admin) nhưng với Vim:

vim -c "v/i'm searching for this/d" -c "g/and don't need this/d" -c "w checkoutput" <INPUT> 

(này mở ra, sau đó sẽ xóa mọi dòng những gì không phù hợp với những gì bạn cần, sau đó xóa tất cả các dòng, những gì bạn không cần, sau đó lưu kết quả như checkoutput. Mà bạn nên kiểm tra.)

HTH

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