2013-02-13 23 views
6

Tôi đã trở nên giỏi hơn ở Regex, nhưng tôi đã nghĩ ra điều gì đó vượt quá những gì tôi hiện có thể làm.Kết hợp một từ, với dấu chấm câu hoặc số nhiều ở cuối (Regex)

Tôi muốn xây dựng một hàm để kiểm tra (trả về true hoặc false) để kiểm tra xem một từ có được tìm thấy bên trong một chuỗi hay không. Nhưng tôi sẽ không muốn có một trận đấu tích cực nếu từ đó được tìm thấy bên trong của một từ khác. Tôi cũng muốn xây dựng trong khả năng kiểm tra số nhiều.

Dưới đây là một số ví dụ về các kết quả tôi mong đợi để có được:

Word để tìm kiếm: "thanh"

"Strings để tìm kiếm trong" // những gì nó nên trở lại như

"foo bar" // true

"foo bar". // true

"thanh foo!" // true (sẽ đúng với bất kỳ dấu câu nào khác trước hoặc sau 'thanh' quá)

"thanh foo". // true

"foo bares". // true (mặc dù bares có ý nghĩa khác nhau thì thanh, tôi sẽ ổn với điều này trở lại đúng vì tôi cần phải kiểm tra các từ có số nhiều với "es" và tôi sẽ không mong đợi để xây dựng một regex để biết từ nào pluralize với "s" và để "es")

"my name is bart simpson" // false (thanh thực sự là một phần của "bart")

"bart simpson đi đến quầy bar." // true

tôi sẽ sử dụng javascript/jquery để kiểm tra các trận đấu

Cảm ơn rất nhiều cho sự giúp đỡ!

+0

Vì vậy, "trẻ em" không được dự kiến ​​sẽ khớp với "trẻ em", đúng không? –

+0

Vâng, tôi sẽ không mong đợi "đứa trẻ" để phù hợp với "trẻ em". – rgbflawed

+4

Đa số hóa không phải là dễ dàng để làm với các biểu thức thông thường. Điều gì về _mouse/mice_ và _colossus/colossi_? – Halcyon

Trả lời

4
var rgx = new RegExp('\\b' + word + '(?:es|s)?\\b'); 
rgx.test(string); 

Điều này sẽ trả về true cho tất cả các chuỗi bạn đã chỉ định trong yêu cầu của bạn. \b đại diện cho "ranh giới từ", mà tôi tin là bất kỳ ký tự nào trong \W (bao gồm dấu chấm than và dấu chấm than) cũng như phần đầu hoặc cuối của chuỗi.

+0

Công trình này tuyệt vời! Chỉ cần thực hiện một thay đổi để làm cho nó hoạt động. Đã thay đổi "Regex" thành "RegExp". Cảm ơn rất nhiều EP! – rgbflawed

+0

@StevenJenkins oops, tôi đã sử dụng 'RegExp' trong tất cả các bài kiểm tra của mình, nhưng tôi đã viết 'Regex' trong câu trả lời trước. –

0
/ (bar((e)?s)?)[ !?.]/ 

tùy thuộc vào những gì bạn cần chính xác mà điều này có thể hoạt động. nó sẽ không tìm thấy hai thanh trong chuỗi "thanh quán bar" vì không gian chồng chéo.

/ (bar((e)?s)?)(?=[ !?.])/ 

sẽ hoạt động với "thanh quán bar" (hai kết quả) vì js1.5 được hỗ trợ bởi tất cả các trình duyệt hiện nay.

2

Điều này đã được trả lời và chấp nhận, nhưng tôi nghĩ tôi sẽ cung cấp phương pháp tiếp cận được thiết kế theo phương pháp được thiết kế hơi.Khác hơn thế, nó sử dụng chính xác cùng một logic như giải pháp @ExplosionPills':

(function() { 
    var isWord = function(word) { return /^[a-z]+$/i.test(word); }, 

     exceptions = { 
     man: 'men', 
     woman: 'women', 
     child: 'children', 
     mouse: 'mice', 
     tooth: 'teeth', 
     goose: 'geese', 
     foot: 'feet', 
     ox: 'oxen' 
     }, 

     pluralise = function(word) { 
     word = word.toLowerCase(); 

     if (word in exceptions) { 
      // Exceptions 
      return '(?:' + word + '|' + exceptions[word] + ')'; 

     } else if (word.match(/(?:x|s|[cs]h)$/)) { 
      // Sibilants 
      return word + '(?:es)?'; 

     } else if (word.match(/[^f]f$/)) { 
      // Non-Geminate Labio-Dental Fricative (-f > -ves/-fs) 
      return '(?:' + word + 's?|' + word.replace(/f$/, 'ves') + ')'; 

     } else if (word.match(/[^aeiou]y$/)) { 
      // Close-Front Unround Pure Vowel (-Cy > -Cies) 
      return '(?:' + word + '|' + word.replace(/y$/, 'ies') + ')'; 

     } else if (word.substr(-1) == 'o') { 
      // Mid-Back Round Vowel (-o > -oes/-os) 
      return word + '(?:e?s)?'; 

     } else { 
      // Otherwise 
      return word + 's?'; 
     } 
     }; 

    String.prototype.containsNoun = function(singularNoun) { 
    if (!isWord(singularNoun)) throw new TypeError('Invalid word'); 
    var check = new RegExp('\\b' + pluralise(singularNoun) + '\\b', 'gi'); 
    return check.test(this); 
    }; 

    String.prototype.pluralException = function(plural) { 
    if (!isWord(this) || !isWord(plural)) throw new TypeError('Invalid exception'); 

    var singular = this.toLowerCase(); 
    plural = plural.toLowerCase(); 

    if (!(singular in exceptions)) { 
     exceptions[singular] = plural; 
    } 
    }; 
})(); 

Nó mở rộng đối tượng có nguồn gốc String, vì vậy bạn sử dụng nó như vậy:

'Are there some foos in here?'.containsNoun('foo'); // True 

Xem the gist đối với một số Xóa nhanh và thử nghiệm đơn vị bẩn được thực hiện trong Node.js.

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