Javascript Regex: Làm thế nào để đặt một biến trong một biểu thức chính quy?


206

Ví dụ:

function(input){
    var testVar = input;
    string = ...
    string.replace(/ReGeX + testVar + ReGeX/, "replacement")
}

Nhưng điều này tất nhiên là không hoạt động :) Có cách nào để làm điều này?


11
Xin lưu ý rằng nếu bạn cho phép người dùng cung cấp biến này, người dùng độc hại sẽ dễ dàng đánh sập ứng dụng của bạn thông qua việc quay lại thảm khốc.
Tim Pietzcker

2
"ReGeX" là gì? nó có phải là một tên biến không? nó làm cho câu trả lời trở nên khó hiểu bằng cách ngụ ý rằng đó là một phần của cấu trúc RegExp (trong trường hợp người đọc không nhìn thấy những ký tự kỳ lạ đó trong câu hỏi).
Eduard

Câu trả lời:


272
const regex = new RegExp(`ReGeX${testVar}ReGeX`);
...
string.replace(regex, "replacement");

Cập nhật

Mỗi một số ý kiến, điều quan trọng cần lưu ý là bạn có thể muốn thoát khỏi các biến nếu có tiềm năng cho các nội dung độc hại (ví dụ như biến xuất phát từ người dùng nhập vào)

Cập nhật ES6

Năm 2019, điều này thường sẽ được viết bằng chuỗi mẫu và mã trên đã được cập nhật. Câu trả lời ban đầu là:

var regex = new RegExp("ReGeX" + testVar + "ReGeX");
...
string.replace(regex, "replacement");

5
Hãy chắc chắn để thoát khỏi chuỗi của bạn! Xem câu trả lời @zzzzBov
jtpereyda

Đây không phải là làm việc trong trường hợp của tôi, bạn có thể xin vui lòng có một cái nhìn jsfiddle này và cho tôi biết nếu những gì tôi phải làm gì nếu tôi muốn thiết lập một động mã quốc gia vào regexbiểu
Kirankumar Dafda

10
Một điều quan trọng cần nhớ là trong các chuỗi thông thường, ký tự \ cần được thoát trong khi ở dạng regex theo nghĩa đen (thông thường), ký tự / cần phải được thoát. Vì vậy, /\w+\//itrở thànhnew RegExp("\\w+/", "i")
Ali

3
Làm thế nào về / g?
Qian Chen

Các bạn ơi, tôi cần chia regex này / [^ ^ 9-9.
tối đa

79

Bạn có thể sử dụng đối tượng RegExp:

var regexstring = "whatever";
var regexp = new RegExp(regexstring, "gi");
var str = "whateverTest";
var str2 = str.replace(regexp, "other");
document.write(str2);

Sau đó, bạn có thể xây dựng regexstringtheo bất kỳ cách nào bạn muốn.

Bạn có thể đọc thêm về nó ở đây .


var characterCount = parseInt (attrs.limitCharacterCount); console.log (characterCount); var SpecialChar characterValidation = new RegExp ("/ ^ [a-zA-Z0-9] {" + characterCount + "} $ /"); / \ / ^ [a-zA-Z0-9] {7} $ \ // requestShipmentDirectives.js: 76 false main.js: 46 Uncaught TypeError: Không thể đọc thuộc tính 'offsetWidth' của null Đây là điều đang xảy ra khi tôi tạo RegEx Dynamic.
Ankit Tanna

31

Để tạo biểu thức chính quy từ một biến trong JavaScript, bạn sẽ cần sử dụng hàm RegExptạo với tham số chuỗi.

function reg(input) {
    var flags;
    //could be any combination of 'g', 'i', and 'm'
    flags = 'g';
    return new RegExp('ReGeX' + input + 'ReGeX', flags);
}

Tất nhiên, đây là một ví dụ rất ngây thơ. Nó giả định rằng inputđã được thoát đúng cho một biểu thức chính quy. Nếu bạn đang xử lý đầu vào của người dùng hoặc chỉ đơn giản là muốn thuận tiện hơn để khớp các ký tự đặc biệt, bạn sẽ cần phải thoát các ký tự đặc biệt :

function regexEscape(str) {
    return str.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')
}

function reg(input) {
    var flags;
    //could be any combination of 'g', 'i', and 'm'
    flags = 'g';
    input = regexEscape(input);
    return new RegExp('ReGeX' + input + 'ReGeX', flags);
}

Cách duy nhất làm việc cho tôi là nếu tôi xóa ReGeXvăn bản. Vì vậy, tôi đã sử dụng:return new RegExp(input, flags);
Michael Rader

2
@MichaelRader, vâng, văn bản "ReGeX" là một phần của câu hỏi và được sử dụng làm ví dụ, không phải là thứ bắt buộc để làm cho mã hoạt động.
zzzzBov

1
lol chỉ nhận ra rằng đó chỉ là trình giữ chỗ của bạn, nhưng như một người mới, điều này khiến tôi mất một lúc để tìm ra. Cảm ơn.
Michael Rader

Tôi hiểu tại sao chuỗi cần phải được thoát. Nhưng tại sao '\\ $ &' ​​được sử dụng thay thế
Sherin Binu

2
\\đại diện cho một \ký tự duy nhất , $&là chuỗi con phù hợp .
zzzzBov

7

nếu bạn đang sử dụng mẫu chữ es6 là một tùy chọn ...

string.replace(new RegExp(`ReGeX${testVar}ReGeX`), "replacement")

Nó không hoạt động với mẫu chữ. Tôi đang sử dụng regrec để xác thực mật khẩu trong ứng dụng của mình và tôi muốn tham số hóa độ dài tối đa và tối thiểu trong chuỗi biểu thức chính quy của mình và nó không hoạt động. `` `const newRegExp = new RegExp ( ^[^\s]{${4},${32}}$); xuất const constateatePassword = value => value.match (newRegExp); `` `
p7adams

6

Bạn luôn có thể đưa ra biểu thức chính quy dưới dạng chuỗi, tức là "ReGeX" + testVar + "ReGeX" . Bạn có thể phải thoát một số ký tự bên trong chuỗi của mình (ví dụ: trích dẫn kép), nhưng đối với hầu hết các trường hợp, nó tương đương.

Bạn cũng có thể sử dụng hàm RegExptạo để truyền cờ trong ( xem tài liệu ).


3

Bạn có thể tạo các biểu thức chính quy trong JS theo một trong hai cách:

  1. Sử dụng biểu thức chính quy - /ab{2}/g
  2. Sử dụng hàm tạo biểu thức chính quy - new RegExp("ab{2}", "g").

Chữ biểu thức chính quy là hằng số và không thể được sử dụng với các biến. Điều này có thể đạt được bằng cách sử dụng các nhà xây dựng. Cấu trúc của hàm tạo RegEx là

new RegExp(regularExpressionString, modifiersString)

Bạn có thể nhúng các biến như một phần của normalExpressionString. Ví dụ,

var pattern="cd"
var repeats=3
new RegExp(`${pattern}{${repeats}}`, "g") 

Điều này sẽ phù hợp với bất kỳ sự xuất hiện của các mẫu cdcdcd.


2

Đây là một hàm khá vô dụng trả về các giá trị được bao bọc bởi các ký tự cụ thể. :)

jsfiddle: https://jsfiddle.net/squadjot/43agwo6x/

function getValsWrappedIn(str,c1,c2){
    var rg = new RegExp("(?<=\\"+c1+")(.*?)(?=\\"+c2+")","g"); 
    return str.match(rg);
    }

var exampleStr = "Something (5) or some time (19) or maybe a (thingy)";
var results =  getValsWrappedIn(exampleStr,"(",")")

// Will return array ["5","19","thingy"]
console.log(results)

2

câu trả lời được chấp nhận không hoạt động đối với tôi và không tuân theo các ví dụ MDN

xem phần 'Mô tả' trong liên kết ở trên

Tôi sẽ làm theo những điều sau đây cho tôi:

let stringThatIsGoingToChange = 'findMe';
let flagsYouWant = 'gi' //simple string with flags
let dynamicRegExp = new RegExp(`${stringThatIsGoingToChange}`, flagsYouWant)

// that makes dynamicRegExp = /findMe/gi

1
Nó vẫn làm việc. Vấn đề là 'ReGeX' + testVar + 'ReGeX' làm cho giải pháp trở nên khó hiểu. Thêm một ví dụ thực sự sẽ làm sáng tỏ mọi thứ theo ý kiến ​​của tôi. var testVar = '321'; var regex = new RegExp ("[" + testVar + "] {2}", "g"); // ở trên tương đương với / [321] {2} / g
HelloWorldPeace

1

Trước tiên, chỉ cần chuẩn bị biến chuỗi, sau đó chuyển đổi nó thành RegEx.

ví dụ:

Bạn muốn thêm minLengthMaxLengthvới biến vào RegEx:

function getRegEx() {
    const minLength = "5"; // for exapmle: min is 5
    const maxLength = "12"; // for exapmle: man is 12

    var regEx = "^.{" + minLength + ","+ maxLength +"}$"; // first we make a String variable of our RegEx
    regEx = new RegExp(regEx, "g"); // now we convert it to RegEx

    return regEx; // In the end, we return the RegEx
}

bây giờ nếu bạn thay đổi giá trị của MaxLengthhoặc MinLength, Nó sẽ thay đổi trong tất cả các RegEx.

Hy vọng sẽ hữu ích. Cũng xin lỗi về tiếng Anh của tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.