2015-12-29 13 views
5

Tôi đã đọc qua rất nhiều nội dung thú vị gần đây về regex. Đặc biệt là về creating your own regex boundariesLàm cách nào để tôi có thể kết hợp hai chữ cái viết hoa với nhau, không phải trước ký tự đặc biệt, sử dụng regex?

Một điều mà tôi không nghĩ rằng mình đã xem xong (tôi đã hoàn thành 100%, nhưng tôi chưa nhận thấy bất kỳ ví dụ nào) là cách loại trừ một kết hợp regex nếu nó được đặt trước bằng 'ký tự đặc biệt', chẳng hạn như &! % $ #. Ví dụ:

Nếu tôi sử dụng regex (Lưu ý đây là từ C#)

([A-Z]{2,}\\b) 

Nó sẽ phù hợp với bất kỳ chữ in hoa có hai hoặc nhiều hơn trong chiều dài, và sử dụng các ranh giới \b để đảm bảo hai chữ in hoa không bắt đầu bằng hoặc kết thúc bằng bất kỳ chữ cái nào khác. Nhưng đây là nơi tôi không chắc chắn cách này sẽ hành xử:

AA -Kết hợp

SAB -Không trận đấu

ACS -Không trận đấu

AD -! Trận đấu

AF! -Match

Tôi muốn biết cách chỉ chọn hai hoặc nhiều chữ cái viết hoa trước chữ cái/số/ký tự viết thường hoặc tiếp theo là chữ thường/số/ký tự đặc biệt.

Tôi đã thấy mọi người sử dụng khoảng trắng, vì vậy hãy đảm bảo chuỗi bắt đầu bằng hoặc kết thúc bằng dấu cách, nhưng không hoạt động nếu nó ở đầu hoặc cuối dòng.

Vì vậy, đầu ra tôi sẽ tìm kiếm từ ví dụ trên sẽ là:

AA -Kết hợp

SAB -Không trận đấu

ACS -Không trận đấu

! AD -Không có trận đấu

AF! -Không khớp với

Mọi trợ giúp đều được đánh giá cao.

+0

Có vẻ như bạn đang muốn một ranh giới từ trên cả hai Mặt của 2 chữ hoa? –

+0

Bạn có ý nghĩa gì? '\ p {S}'? Biểu tượng –

+0

có lẽ là từ sai. Tôi nên nói những ký tự đặc biệt như tôi đã làm trước đó trong câu hỏi "! @ # $%^& *()" – trueCamelType

Trả lời

2

Bạn chỉ cần sử dụng một lookbehind và một lookahead:

(?<![a-z\[email protected]#$%^&*()])[A-Z]{2,}(?![a-z\[email protected]#$%^&*()]) 

Xem regex demo

Các (?<![a-z\[email protected]#$%^&*()]) lookbehind đảm bảo không có chữ thường chữ cái ([a-z]), chữ số (\d) hoặc các ký tự đặc biệt mà bạn đã xác định. Nếu có, trận đấu không thành công, không có gì được trả về.

Hình thu nhỏ (?![a-z\[email protected]#$%^&*()]) cũng không khớp nếu các ký tự giống nhau được tìm thấy sau chữ cái ALLCAPS.

Xem thêm chi tiết về Lookahead and Lookbehind Zero-Length Assertions here.

+1

Cảm ơn bạn rất nhiều, đó là một lời giải thích tuyệt vời. Tôi đã không được sử dụng \ d ở tất cả, và bây giờ tôi có thể khám phá lookbehind và lookahead nhiều hơn nữa. Cảm ơn! – trueCamelType

+1

Bên cạnh '\ d', trong C# bạn có thể sử dụng' \ p {N} 'để khớp các chữ số, nhưng' \ d' ngắn hơn. Chỉ một lưu ý phụ: '\ d' cũng sẽ khớp với tất cả các chữ số Unicode (tiếng Ả Rập, tiếng Do Thái, tiếng Hindi, v.v.), do đó bạn có thể vẫn muốn giới hạn chỉ những chữ cái ASCII có' [0-9] '. –

1

Tôi nghĩ rằng nó đủ để chỉ đứng trước mẫu bạn có với sự phủ định của chữ thường và bất kỳ biểu tượng nào bạn muốn loại trừ. Ví dụ của tôi chỉ loại trừ !, nhưng bạn có thể thêm vào danh sách phù hợp. ^ bên trong dấu ngoặc đơn phủ nhận nội dung bên trong chúng.Vì vậy, ví dụ, bạn có thể kết hợp các mô hình

/[^a-z!][A-Z]{2,}[^a-z!]/g 
Các vấn đề liên quan