Hướng dẫn javascript regex get string between two characters - javascript regex lấy chuỗi giữa hai ký tự

Biểu thức chính quy để có được một chuỗi giữa hai chuỗi trong JavaScript

Giải pháp hoàn chỉnh nhất sẽ hoạt động trong phần lớn các trường hợp là sử dụng một nhóm bắt giữ với mẫu phù hợp với chấm lười biếng. Tuy nhiên, một DOT

cow (.*?) milk
1 trong JavaScript Regex không khớp với các ký tự ngắt dòng, vì vậy, những gì sẽ hoạt động trong 100% trường hợp là một cấu trúc
cow (.*?) milk
2 hoặc ____ 13/________ 14/________ 15.capturing group with a lazy dot matching pattern. However, a dot
cow (.*?) milk
1 in JavaScript regex does not match line break characters, so, what will work in 100% cases is a
cow (.*?) milk
2 or
cow (.*?) milk
3/
cow (.*?) milk
4/
cow (.*?) milk
5 constructs.

Ecmascript 2018 và giải pháp tương thích mới hơn

Trong môi trường JavaScript hỗ trợ Ecmascript 2018, công cụ sửa đổi

cow (.*?) milk
6 cho phép
cow (.*?) milk
1 phù hợp với bất kỳ char nào bao gồm các ký tự phá vỡ dòng và động cơ Regex hỗ trợ các quan điểm có độ dài thay đổi. Vì vậy, bạn có thể sử dụng một regex như

var result = s.match(/(?<=cow\s+).*?(?=\s+milk)/gs); // Returns multiple matches if any
// Or
var result = s.match(/(?<=cow\s*).*?(?=\s*milk)/gs); // Same but whitespaces are optional

Trong cả hai trường hợp, vị trí hiện tại được kiểm tra cho

cow (.*?) milk
8 với bất kỳ khoảng trắng 1/0 trở lên nào sau
cow (.*?) milk
8, sau đó bất kỳ 0+ ký tự nào càng tốt được khớp và tiêu thụ (= được thêm vào giá trị khớp), sau đó
cow ([\s\S]*?) milk
0 được kiểm tra (với bất kỳ 1/0 hoặc nhiều không gian trắng trước khi con này).

Kịch bản 1: Đầu vào một dòng

Điều này và tất cả các kịch bản khác dưới đây được hỗ trợ bởi tất cả các môi trường JavaScript. Xem các ví dụ sử dụng ở dưới cùng của câu trả lời.

cow (.*?) milk

cow (.*?) milk
8 được tìm thấy đầu tiên, sau đó là một không gian, sau đó bất kỳ 0+ ký tự nào khác ngoài các ký tự phá vỡ dòng, càng ít càng tốt
cow ([\s\S]*?) milk
2 là một bộ định lượng lười biếng, được bắt vào nhóm 1 và sau đó là một không gian với
cow ([\s\S]*?) milk
0 phải tuân theo (và chúng được khớp và tiêu thụ, quá).

Kịch bản 2: Đầu vào đa dòng

cow ([\s\S]*?) milk

Ở đây,

cow (.*?) milk
8 và một không gian được khớp trước, sau đó bất kỳ số 0+ nào càng ít càng tốt được khớp và chụp thành nhóm 1, và sau đó một không gian với
cow ([\s\S]*?) milk
0 đều được khớp.

Kịch bản 3: Các trận đấu chồng chéo

Nếu bạn có một chuỗi như

cow ([\s\S]*?) milk
6 và bạn cần có 2 trận đấu ở giữa ____ 27+________ 28+________ 29 và
cow ([\s\S]*?) milk
7, bạn không thể sử dụng Tìm trận đấu đầu tiên. Bạn có thể sử dụng một cái nhìn tích cực để kiểm tra sự hiện diện văn bản mà không thực sự "ngấu nghiến" nó (tức là nối vào trận đấu):positive lookahead to check for the text presence without actually "gobbling" it (i.e. appending to the match):

/>>>\d+\s(.*?)(?=>>>)/g

Xem bản demo regex trực tuyến mang lại

/>>>\d+\s(.*?)(?=>>>)/g
4 và
/>>>\d+\s(.*?)(?=>>>)/g
5 như nội dung nhóm 1 được tìm thấy.

Cũng xem làm thế nào để có được tất cả các trận đấu chồng chéo có thể cho một chuỗi.

Cân nhắc hiệu suất

Mẫu khớp chấm lười (

/>>>\d+\s(.*?)(?=>>>)/g
6) bên trong các mẫu regex có thể làm chậm thực thi tập lệnh nếu đầu vào rất dài được đưa ra. Trong nhiều trường hợp, kỹ thuật không kiểm soát vòng lặp giúp ở mức độ lớn hơn. Cố gắng lấy tất cả giữa
cow (.*?) milk
8 và
cow ([\s\S]*?) milk
0 từ
/>>>\d+\s(.*?)(?=>>>)/g
9, chúng ta thấy rằng chúng ta chỉ cần khớp với tất cả các dòng không bắt đầu với
cow ([\s\S]*?) milk
0, do đó, thay vì
/cow\n(.*(?:\n(?!milk$).*)*)\nmilk/gm
1 chúng ta có thể sử dụng:

/cow\n(.*(?:\n(?!milk$).*)*)\nmilk/gm

Xem bản demo regex (nếu có thể có

/cow\n(.*(?:\n(?!milk$).*)*)\nmilk/gm
2, sử dụng
/cow\n(.*(?:\n(?!milk$).*)*)\nmilk/gm
3). Với chuỗi thử nghiệm nhỏ này, mức tăng hiệu suất là không đáng kể, nhưng với văn bản rất lớn, bạn sẽ cảm thấy sự khác biệt (đặc biệt là nếu các dòng dài và các đường nét không nhiều).

Mẫu sử dụng Regex trong JavaScript:

//Single/First match expected: use no global modifier and access match[1]
console.log("My cow always gives milk".match(/cow (.*?) milk/)[1]);
// Multiple matches: get multiple matches with a global modifier and
// trim the results if length of leading/trailing delimiters is known
var s = "My cow always gives milk, thier cow also gives milk";
console.log(s.match(/cow (.*?) milk/g).map(function(x) {return x.substr(4,x.length-9);}));
//or use RegExp#exec inside a loop to collect all the Group 1 contents
var result = [], m, rx = /cow (.*?) milk/g;
while ((m=rx.exec(s)) !== null) {
  result.push(m[1]);
}
console.log(result);

Sử dụng phương pháp /cow\n(.*(?:\n(?!milk$).*)*)\nmilk/gm 4 hiện đại

const s = "My cow always gives milk, thier cow also gives milk";
const matches = s.matchAll(/cow (.*?) milk/g);
console.log(Array.from(matches, x => x[1]));

Biểu thức chính quy là vô cùng mạnh mẽ nhưng cú pháp của chúng có thể khá mờ đục. Hôm nay, chúng tôi sẽ sử dụng Regex để nắm bắt tất cả nội dung giữa hai ký tự.

Ví dụ Thiết lập vấn đề

Hãy nói rằng chúng tôi có chuỗi sau:

Xin chào, tên tôi là [tên], tôi [tuổi] tuổi và tôi làm việc trong lĩnh vực [nghề].

Và chúng tôi muốn kết thúc với mảng sau:

['name', 'age', 'profession'];

Làm thế nào chúng ta có thể làm điều này?

Sử dụng phương thức chuỗi .Match

Trước hết, chúng tôi sẽ muốn sử dụng phương thức chuỗi JavaScript

/cow\n(.*(?:\n(?!milk$).*)*)\nmilk/gm
5, lấy một chuỗi hoặc biểu thức chính quy làm đối số.

const str =
  'Hi there, my name is [name], I am [age] years old, and I work in the field of [profession].';

const matches = str.match(/some regex here/);

Nắm bắt giữa các dấu ngoặc, lười biếng

Chúng tôi muốn chụp giữa các dấu ngoặc. Lần đầu tiên của chúng tôi ở đây có thể bao gồm một regex trông như thế này:

/cow\n(.*(?:\n(?!milk$).*)*)\nmilk/gm
6. Nếu chúng ta sử dụng điều này, chúng ta sẽ nhận được như sau:

const str =
  'Hi there, my name is [name], I am [age] years old, and I work in the field of [profession].';

const matches = str.match(/\[.+?\]/g);
console.log(matches);
// ["[name]", "[age]", "[profession]"]

Rất gần! Nhưng chúng tôi không muốn có các dấu ngoặc trong chuỗi cuối cùng của chúng tôi.

Trước khi chúng tôi làm việc để loại bỏ chúng, hãy để đánh giá những gì chúng tôi đã làm trong biểu thức thông thường hiện tại của chúng tôi.

Phần bên ngoài

/cow\n(.*(?:\n(?!milk$).*)*)\nmilk/gm
7 về cơ bản nói một vài điều: các dấu gạch chéo về phía trước cho thấy rằng đây là một regex và
/cow\n(.*(?:\n(?!milk$).*)*)\nmilk/gm
8 chỉ ra rằng đây phải là một regex toàn cầu (tức là, chúng tôi không muốn dừng lại ở trận đấu đầu tiên).

Tiếp theo,

/cow\n(.*(?:\n(?!milk$).*)*)\nmilk/gm
9 và
//Single/First match expected: use no global modifier and access match[1]
console.log("My cow always gives milk".match(/cow (.*?) milk/)[1]);
// Multiple matches: get multiple matches with a global modifier and
// trim the results if length of leading/trailing delimiters is known
var s = "My cow always gives milk, thier cow also gives milk";
console.log(s.match(/cow (.*?) milk/g).map(function(x) {return x.substr(4,x.length-9);}));
//or use RegExp#exec inside a loop to collect all the Group 1 contents
var result = [], m, rx = /cow (.*?) milk/g;
while ((m=rx.exec(s)) !== null) {
  result.push(m[1]);
}
console.log(result);
0 có nghĩa là chúng tôi muốn kết hợp các giá đỡ mở và đóng, nhưng chúng tôi phải sử dụng dấu gạch chéo ngược để thoát khỏi chúng vì bản thân các giá đỡ có những công dụng khác trong thế giới của Regex.

Cuối cùng, chúng tôi có

//Single/First match expected: use no global modifier and access match[1]
console.log("My cow always gives milk".match(/cow (.*?) milk/)[1]);
// Multiple matches: get multiple matches with a global modifier and
// trim the results if length of leading/trailing delimiters is known
var s = "My cow always gives milk, thier cow also gives milk";
console.log(s.match(/cow (.*?) milk/g).map(function(x) {return x.substr(4,x.length-9);}));
//or use RegExp#exec inside a loop to collect all the Group 1 contents
var result = [], m, rx = /cow (.*?) milk/g;
while ((m=rx.exec(s)) !== null) {
  result.push(m[1]);
}
console.log(result);
1. Điều này có nghĩa là chúng tôi muốn ghi lại bất kỳ số lượng ký tự nào cho đến khi chúng tôi đạt được
//Single/First match expected: use no global modifier and access match[1]
console.log("My cow always gives milk".match(/cow (.*?) milk/)[1]);
// Multiple matches: get multiple matches with a global modifier and
// trim the results if length of leading/trailing delimiters is known
var s = "My cow always gives milk, thier cow also gives milk";
console.log(s.match(/cow (.*?) milk/g).map(function(x) {return x.substr(4,x.length-9);}));
//or use RegExp#exec inside a loop to collect all the Group 1 contents
var result = [], m, rx = /cow (.*?) milk/g;
while ((m=rx.exec(s)) !== null) {
  result.push(m[1]);
}
console.log(result);
2 tiếp theo.
//Single/First match expected: use no global modifier and access match[1]
console.log("My cow always gives milk".match(/cow (.*?) milk/)[1]);
// Multiple matches: get multiple matches with a global modifier and
// trim the results if length of leading/trailing delimiters is known
var s = "My cow always gives milk, thier cow also gives milk";
console.log(s.match(/cow (.*?) milk/g).map(function(x) {return x.substr(4,x.length-9);}));
//or use RegExp#exec inside a loop to collect all the Group 1 contents
var result = [], m, rx = /cow (.*?) milk/g;
while ((m=rx.exec(s)) !== null) {
  result.push(m[1]);
}
console.log(result);
3 là lười biếng (nắm bắt số lượng nhỏ nhất cho đến khung tiếp theo) trong khi bạn cũng có thể quen thuộc với
//Single/First match expected: use no global modifier and access match[1]
console.log("My cow always gives milk".match(/cow (.*?) milk/)[1]);
// Multiple matches: get multiple matches with a global modifier and
// trim the results if length of leading/trailing delimiters is known
var s = "My cow always gives milk, thier cow also gives milk";
console.log(s.match(/cow (.*?) milk/g).map(function(x) {return x.substr(4,x.length-9);}));
//or use RegExp#exec inside a loop to collect all the Group 1 contents
var result = [], m, rx = /cow (.*?) milk/g;
while ((m=rx.exec(s)) !== null) {
  result.push(m[1]);
}
console.log(result);
4, sẽ nắm bắt từ khung mở đầu tiên cho đến khi kết thúc cuối cùng!

Loại bỏ các dấu ngoặc

Để loại bỏ các dấu ngoặc, chúng ta có thể sử dụng các nhà khai thác lookahead và lookbehind. Thay vì khớp với các giá đỡ, chúng tôi có thể nói rằng chúng tôi muốn xem xét phía sau khung mở và nhìn về phía trước Braket, nhưng không thực sự bao gồm chúng trong trận đấu của chúng tôi.

Biểu thức chính quy mới với các nhà khai thác Lookahead và Lookbehind của chúng tôi như sau:

cow (.*?) milk
0

Một lần nữa, chúng tôi xem xét phía sau khung mở

//Single/First match expected: use no global modifier and access match[1]
console.log("My cow always gives milk".match(/cow (.*?) milk/)[1]);
// Multiple matches: get multiple matches with a global modifier and
// trim the results if length of leading/trailing delimiters is known
var s = "My cow always gives milk, thier cow also gives milk";
console.log(s.match(/cow (.*?) milk/g).map(function(x) {return x.substr(4,x.length-9);}));
//or use RegExp#exec inside a loop to collect all the Group 1 contents
var result = [], m, rx = /cow (.*?) milk/g;
while ((m=rx.exec(s)) !== null) {
  result.push(m[1]);
}
console.log(result);
5 và chúng tôi nhìn về phía trước khung đóng
//Single/First match expected: use no global modifier and access match[1]
console.log("My cow always gives milk".match(/cow (.*?) milk/)[1]);
// Multiple matches: get multiple matches with a global modifier and
// trim the results if length of leading/trailing delimiters is known
var s = "My cow always gives milk, thier cow also gives milk";
console.log(s.match(/cow (.*?) milk/g).map(function(x) {return x.substr(4,x.length-9);}));
//or use RegExp#exec inside a loop to collect all the Group 1 contents
var result = [], m, rx = /cow (.*?) milk/g;
while ((m=rx.exec(s)) !== null) {
  result.push(m[1]);
}
console.log(result);
6.

Nếu bạn muốn hỗ trợ blog này bằng cách mua cho tôi một ly cà phê, tôi thực sự đánh giá cao nó!