2016-08-11 19 views
5

Tôi đang cố gắng trích xuất các từ [a-zA-Z]+ với một ràng buộc: một từ phải chứa ít nhất một chữ thường và ít nhất một chữ cái viết hoa (ở bất kỳ vị trí nào trong từ). Ví dụ: nếu đầu vào là hello 123 worLD, kết quả phù hợp duy nhất phải là worLD.Kết hợp ít nhất một chữ cái viết thường và ít nhất một chữ cái viết hoa

Tôi cố gắng để sử dụng lookaheads tích cực như thế này:

echo "hello 123 worLD" | grep -oP "(?=.*[a-z])(?=.*[A-Z])[a-zA-Z]+" 
hello 

Đây không phải là chính xác: trận đấu chỉ là hello thay vì worLD. Sau đó, tôi đã thử điều này:

echo "hello 123 worLD" | grep -oP "\K((?=.*[a-z])(?=.*[A-Z])[a-zA-Z]+)" 
hello 
worLD 

Điều này vẫn không chính xác: hello không được khớp.

Trả lời

4

.* trong bảng tra cứu kiểm tra sự hiện diện của chữ cái không chỉ trong từ liền kề, mà sau đó trong chuỗi. Sử dụng [a-zA-Z]*:

echo "hello 123 worLD" | grep -oP "\\b(?=[A-Za-z]*[a-z])(?=[A-Za-z]*[A-Z])[a-zA-Z]+" 

Xem demo online

Tôi cũng đã thêm một ranh giới \b từ lúc bắt đầu để kiểm tra lookahead chỉ được thực hiện sau khi một ranh giới từ.

1

Trả lời:

echo "hello 123 worLD" | grep -oP "\b(?=[A-Z]+[a-z]|[a-z]+[A-Z])[a-zA-Z]*" 

Demo: https://ideone.com/HjLH5o

Giải thích:

séc đầu tiên nếu từ bắt đầu với một hoặc nhiều chữ viết hoa theo sau là một chữ thường hoặc ngược lại theo bởi bất kỳ số chữ thường và chữ hoa nào theo thứ tự bất kỳ.

Hiệu suất:

This solution mất 31 bước để đạt được trận đấu trên chuỗi thử nghiệm được cung cấp, trong khi accepted solution mất 47 bước.

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