2012-02-09 36 views
26

Có thể kết hợp cụm từ thông dụng trong javascript hay không.Kết hợp cụm từ thông dụng trong Javascript

Đối với ví dụ:

var lower = /[a-z]/; 
var upper = /[A-Z]/; 
var alpha = upper|lower;//Is this possible? 

tức. i có thể gán biểu thức thông thường để biến và kết hợp các biến sử dụng mô hình phù hợp với nhân vật như chúng ta làm trong biểu thức thông thường

+0

Bạn có hai regexps riêng biệt hoặc chỉ muốn '/ [a-zA-Z] /'? –

+0

Tôi biết rằng .... Tôi cần phải biết liệu điều này có thể là –

+2

bản sao có thể có của [Kết hợp Regexp] (http://stackoverflow.com/questions/869809/combine-regexp) –

Trả lời

24

Câu trả lời là có! Bạn phải khởi tạo biến dưới lớp RegExp:

var lower = new RegExp(/--RegexCode--/); 
var upper = new RegExp(/--RegexCode--/); 

do đó, regex có thể được tạo động. Sau khi tạo:

"sampleString".replace(/--whatever it should do--/); 

Sau đó, bạn có thể kết hợp chúng bình thường, có.

var finalRe = new RegExp(lower.source + "|" + upper.source); 
+1

@AlanMoore Rất tiếc, tôi sẽ khắc phục sự cố vì bất kỳ ai xem xét điều này vào một ngày sau đó. – Bry6n

+6

phía dưới và phía trên cũng có thể là các biểu thức chính quy. – prasopes

16

Nếu regexps không biết trước,

var one = /[a-z]/; 
var two = /[A-Z]/; 

var one_or_two = new RegExp("(" + one.source + ")|(" + two.source + ")") 
2
alpha = new RegExp(lower.source + "|" + upper.source); 
console.log(alpha); 
// /[a-z]|[A-Z]/ 
5

Nếu đây là điều bạn chỉ cần thực hiện một lần hoặc hai lần, tôi muốn thực hiện theo từng trường hợp như đề xuất của các câu trả lời khác.

Nếu bạn cần làm nhiều, tuy nhiên, một vài chức năng trợ giúp có thể cải thiện khả năng đọc. Ví dụ:

var lower = /[a-z]/, 
    upper = /[A-Z]/, 
    digit = /[0-9]/; 

// All of these are equivalent, and will evaluate to /(?:a-z)|(?:A-Z)|(?:0-9)/ 
var anum1 = RegExp.any(lower, upper, digit), 
    anum2 = lower.or(upper).or(digit), 
    anum3 = lower.or(upper, digit); 

Và đây là mã nếu bạn muốn sử dụng những chức năng:

RegExp.any = function() { 
    var components = [], 
     arg; 

    for (var i = 0; i < arguments.length; i++) { 
     arg = arguments[i]; 
     if (arg instanceof RegExp) { 
      components = components.concat(arg._components || arg.source); 
     } 
    } 

    var combined = new RegExp("(?:" + components.join(")|(?:") + ")"); 
    combined._components = components; // For chained calls to "or" method 
    return combined; 
}; 

RegExp.prototype.or = function() { 
    var args = Array.prototype.slice.call(arguments); 
    return RegExp.any.apply(null, [this].concat(args)); 
}; 

Các phương án được bao bọc trong không chụp nhóm và kết hợp với các nhà điều hành phân ly, làm cho này một phần nào hơn cách tiếp cận mạnh mẽ cho các cụm từ thông dụng phức tạp hơn.

Lưu ý rằng bạn sẽ cần phải bao gồm mã này trước khi gọi hàm trợ giúp!

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