Ý nghĩa của cờ 'g' trong biểu thức chính quy là gì?


110

Ý nghĩa của gcờ trong biểu thức chính quy là gì?

Sự khác biệt giữa /.+/gvà là /.+/gì?

Câu trả lời:


130

gdành cho tìm kiếm toàn cầu. Có nghĩa là nó sẽ khớp với tất cả các lần xuất hiện. Bạn cũng sẽ thường thấy iđiều này có nghĩa là bỏ qua trường hợp.

Tham khảo: global - JavaScript | MDN

Cờ "g" chỉ ra rằng biểu thức chính quy phải được kiểm tra với tất cả các kết quả phù hợp có thể có trong một chuỗi.

Nếu không có gcờ, nó sẽ chỉ thử nghiệm cho người đầu tiên.


1
Vì vậy, cờ / g là không thích hợp khi sử dụng hàm .test, vì dù sao nó cũng chỉ tìm thấy kết quả phù hợp đầu tiên, phải không?
xr280xr

10
@ xr280xr Không phải là không liên quan, giống như phản tác dụng. Nó sẽ phá vỡ mọi thứ nếu bạn sử dụng lại RegExp. var r = /a/g; console.log(r.test('a'), r.test('a')); // true false
Janosch,


40

Ví dụ trong Javascript để giải thích:

> 'aaa'.match(/a/g)
[ 'a', 'a', 'a' ]

> 'aaa'.match(/a/)
[ 'a', index: 0, input: 'aaa' ]

10

g là lá cờ tìm kiếm toàn cầu.

Cờ tìm kiếm toàn cục làm cho RegExp tìm kiếm một mẫu trong suốt chuỗi, tạo ra một mảng tất cả các lần xuất hiện mà nó có thể tìm thấy khớp với mẫu đã cho.

Vì vậy, sự khác biệt giữa /.+/g/.+/gphiên bản sẽ tìm thấy mọi lần xuất hiện thay vì chỉ lần đầu tiên.


9

Không có sự khác biệt giữa /.+/g/.+/bởi vì cả hai sẽ chỉ khớp với toàn bộ chuỗi một lần. Sự gkhác biệt tạo ra sự khác biệt nếu biểu thức chính quy có thể khớp nhiều lần hoặc chứa các nhóm, trong trường hợp .match()này sẽ trả về một mảng các kết quả phù hợp thay vì một mảng các nhóm.


8

Như @matiska đã chỉ ra, gcờ cũng đặt thuộc lastIndextính.

Một tác dụng phụ rất quan trọng của điều này là nếu bạn đang sử dụng lại cùng một phiên bản regex với một chuỗi phù hợp, thì cuối cùng nó sẽ không thành công vì nó chỉ bắt đầu tìm kiếm tại lastIndex.

// regular regex
const regex = /foo/;

// same regex with global flag
const regexG = /foo/g;

const str = " foo foo foo ";

const test = (r) => console.log(
    r,
    r.lastIndex,
    r.test(str),
    r.lastIndex
);

// Test the normal one 4 times (success)
test(regex);
test(regex);
test(regex);
test(regex);

// Test the global one 4 times
// (3 passes and a fail)
test(regexG);
test(regexG);
test(regexG);
test(regexG);


6

Bên cạnh ý nghĩa đã được đề cập của gcờ, nó ảnh hưởng đến regexp.lastIndextài sản:

LastIndex là một thuộc tính số nguyên đọc / ghi của các phiên bản biểu thức chính quy chỉ định chỉ mục để bắt đầu trận đấu tiếp theo. (...) Thuộc tính này chỉ được đặt nếu phiên bản biểu thức chính quy sử dụng cờ "g" để biểu thị tìm kiếm toàn cục.

Tham khảo: Mạng nhà phát triển Mozilla


3

G trong biểu thức chính quy là một định nghĩa tìm kiếm toàn cục, có nghĩa là nó sẽ tìm kiếm tất cả các trường hợp trên tất cả các dòng.


1

Sẽ đưa ra ví dụ dựa trên chuỗi. Nếu chúng ta muốn xóa tất cả các lần xuất hiện khỏi một chuỗi. Hãy nói nếu chúng tôi muốn xóa tất cả các lần xuất hiện của "o" với "" khỏi "hello world"

"hello world".replace(/o/g,'');

0
  1. g -> trả về tất cả các trận đấu
  2. without g -> trả về trận đấu đầu tiên

thí dụ:

  1. '1 2 1 5 6 7'.match(/\d+/)lợi nhuận ["1", index: 0, input: "1 2 1 5 6 7", groups: undefined]. Như bạn thấy, chúng tôi chỉ có thể thực hiện trận đấu đầu tiên "1".
  2. '1 2 1 5 6 7'.match(/\d+/g)trả về một mảng của tất cả các kết quả phù hợp ["1", "2", "1", "5", "6", "7"].

1
Vui lòng giải thích thêm về điều đó - sự khác biệt giữa "tất cả các trận đấu" và "trận đấu đầu tiên" là gì?
Nico Haase

Tôi giải thích thêm. Cảm ơn sự hướng dẫn của bạn
Nagibaba

@NicoHaase, bạn có thể vui lòng xóa tỷ lệ âm của mình được không? Tôi đã cố gắng giải thích nhiều hơn.
Nagibaba

Xin lỗi vì sự hiểu lầm :)
Nagibaba
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.