2011-12-06 34 views
9

Tôi không thể tìm ra cách soạn biểu thức chính quy (được sử dụng trong Javascript) thực hiện như sau:Biểu thức chính quy đối sánh phủ định

Đối sánh tất cả các chuỗi nơi ký tự thứ 4 không chứa "GP ".

Một số ví dụ chuỗi:

  • EDAR - phù hợp!
  • EDARGP - không phù hợp
  • EDARDTGPRI - không phù hợp
  • ECMRNL - trận đấu

tôi muốn tình yêu một số trợ giúp ở đây ...

+0

Tôi sẽ tiêu thụ bốn ký tự đầu tiên và sau đó tìm kiếm GP. Là một regex thậm chí cần thiết ở đây? Tại sao không làm một cái gì đó như '" EDARGP ".slice (4) .indexOf ('GP') == -1'? – JesseBuesking

+0

Điều đó có thể hoạt động, ngoại trừ việc tôi không thể thay đổi "mã", tôi chỉ có thể thay đổi chuỗi regex, vì mã cần làm việc với nhiều loại giá trị đầu vào –

Trả lời

11

Sử dụng khẳng định zero-width:

if (subject.match(/^.{4}(?!.*GP)/)) { 
    // Successful match 
} 

Giải thích:

" 
^  # Assert position at the beginning of the string 
.  # Match any single character that is not a line break character 
    {4} # Exactly 4 times 
(?!  # Assert that it is impossible to match the regex below starting at this position (negative lookahead) 
    .  # Match any single character that is not a line break character 
     * # Between zero and unlimited times, as many times as possible, giving back as needed (greedy) 
    GP # Match the characters “GP” literally 
) 
" 
+1

Bạn nhận được giải thích này như thế nào? Nó trông tự động tạo ra, trong trường hợp đó tôi rất muốn biết bạn đã sử dụng công cụ nào. – Bart

+1

@Bart Regexbuddy :) – FailedDev

+0

Cảm ơn @FailedDev! – Bart

7

Bạn có thể sử dụng những gì được gọi là một lookahead tiêu cực khẳng định ở đây. Nó nhìn vào chuỗi phía trước vị trí và kết hợp chỉ khi mẫu chứa/không/tìm thấy. Dưới đây là một biểu thức chính quy ví dụ:

/^.{4}(?!.*GP)/ 

Điều này chỉ khớp với, sau bốn ký tự đầu tiên, chuỗi GP không được tìm thấy.

+2

Bạn đã thắng cuộc đua. :) +1 – FailedDev

+0

Cảm ơn, công trình này. Chỉ cần không chắc chắn những gì "?!" một phần ... –

2

có thể làm một cái gì đó như thế này:

var str = "EDARDTGPRI"; 
var test = !(/GP/.test(str.substr(4))); 

thử nghiệm sẽ trở lại đúng đối với các trận đấu và sai cho không.

+0

Thay thế tuyệt vời. +1. – FailedDev

+1

@FailedDev cảm ơn nhưng tất nhiên bạn và Dan có câu trả lời đúng: P được thực hiện tốt. –

+0

Chúng tôi? Giải pháp của bạn có lẽ nhanh hơn chưa kể đến đơn giản :) – FailedDev

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