Regex để khớp chuỗi chứa hai tên theo thứ tự bất kỳ


180

Tôi cần logic VÀ trong regex.

cái gì đó như

jack VÀ james

đồng ý với các chuỗi sau

  • 'chào jack ở đây là james '

  • 'hi james ở đây là jack '



@AndersonGreen, câu hỏi đã bị khóa sớm. Những câu trả lời đang thiếu trầm trọng như những giải pháp không khả thi vì hầu hết các regex không nhận ra lookaroundchế độ lượng hóa . Tôi tin rằng định lượng tồn tại ở điểm của câu hỏi đang được hỏi.
XPMai

Câu trả lời:


261

Bạn có thể thực hiện kiểm tra bằng cách sử dụng lookaround :

^(?=.*\bjack\b)(?=.*\bjames\b).*$

Kiểm tra nó

Cách tiếp cận này có ưu điểm là bạn có thể dễ dàng chỉ định nhiều điều kiện.

^(?=.*\bjack\b)(?=.*\bjames\b)(?=.*\bjason\b)(?=.*\bjules\b).*$

18
Ai đó có thể giải thích chi tiết hơn một chút về ví dụ này hoạt động như thế nào không?
bjmc

2
vimcú pháp: ^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$hoặc\v^(.*<jack>)@=(.*<james>)@=.*$
mykhal

Có ai biết tại sao điều này sẽ phá vỡ (ít nhất là JavaScript) khi tôi cố gắng tìm kiếm các chuỗi bắt đầu bằng '#' không? ^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$không phù hợp blah #tgif blah #friday blahnhưng ^(?=.*\bfriday\b)(?=.*\btgif\b).*$hoạt động tốt.
bussyffler

2
\bnghĩa là gì ở đây?
VarunAgw


106

Thử:

james.*jack

Nếu bạn muốn cả hai cùng một lúc, thì orchúng:

james.*jack|jack.*james

1
Các câu trả lời được chấp nhận làm việc. điều này cũng làm việc hoàn hảo cho tôi. Để tìm kiếm mã trong studio trực quan, 'tìm kết quả'.
Sữa chua The Wise

1
Điều này làm việc cho tôi và ngắn gọn và dễ hiểu hơn nhiều so với câu trả lời được chấp nhận!
Kumar Manish

1
Tôi cần một giải pháp chỉ có hai tên phù hợp, vì vậy câu trả lời này ngắn gọn hơn cho trường hợp đó. Nhưng câu trả lời được chấp nhận trở nên ngắn gọn hơn 2 vì số lượng "hoặc" tăng theo hệ số. Đối với 3 tên sẽ có 6 "hoặc" s, 4 tên sẽ là 24 "hoặc" s, v.v.
WileCau

Tôi muốn giới thiệu để làm cho nó lười biếng james.*?jack|jack.*?james. Điều này sẽ giúp trên các văn bản lớn.
Jekis

42

Giải thích về lệnh mà tôi sẽ viết : -

. có nghĩa là bất kỳ ký tự, chữ số có thể đến thay thế.

* có nghĩa là không hoặc nhiều lần xuất hiện của điều được viết trước đó.

|có nghĩa là 'hoặc' .

Vì thế,

james.*jack

sẽ tìm kiếm james , sau đó bất kỳ số lượng nhân vật cho đến khi jackđến.

bạn muốn jack.*jameshoặcjames.*jack

Do đó lệnh :

jack.*james|james.*jack

7
Như một lưu ý phụ - bạn cũng có thể đã chỉnh sửa câu trả lời của @ icyrock (giống như của bạn, chỉ 6 năm trước đó), lời giải thích của bạn rất hữu ích.
WoJ

2
Cảm ơn bạn vì câu trả lời này, tuy nhiên tôi cảm thấy cần phải chỉ ra rằng trong tìm kiếm VSCode, jack câu trả lời của bạn . * James | james. * jack sẽ lấy khoảng trắng giữa '|' (hoặc) biểu tượng để xem xét trong quá trình tìm kiếm. jack. * james | james. * jack hoạt động và không tìm kiếm khoảng trắng
jgritten

2
NẾU $ _explanation === "tuyệt vời" THÌ trả lại $ THUMBS_UP ENDIF;
Syed Aqeel



2

Vim có một nhà điều hành chi nhánh \& rất hữu ích khi tìm kiếm một dòng chứa một tập hợp các từ, theo bất kỳ thứ tự nào. Hơn nữa, việc mở rộng tập hợp các từ cần thiết là chuyện nhỏ.

Ví dụ,

/.*jack\&.*james

sẽ khớp với một dòng chứa jackjames, theo thứ tự bất kỳ.

Xem câu trả lời này để biết thêm thông tin về việc sử dụng. Tôi không biết bất kỳ hương vị regex nào khác thực hiện phân nhánh; toán tử thậm chí không được ghi lại trong mục wikipedia biểu thức chính quy .


2

PHƯƠNG PHÁP 1: Một jackvà Mộtjames

Chỉ trong trường hợp, hai jackhoặc hai jamessẽ không được phép, chỉ một jackvà một jameslà hợp lệ, chúng ta có thể thiết kế một biểu thức tương tự như:

^(?!.*\bjack\b.*\bjack\b)(?!.*\bjames\b.*\bjames\b)(?=.*\bjames\b)(?=.*\bjack\b).*$

Ở đây, chúng tôi sẽ loại trừ các trường hợp cặp đó bằng cách sử dụng, các câu lệnh sau:

(?!.*\bjack\b.*\bjack\b)

và,

(?!.*\bjames\b.*\bjames\b)

Bản giới thiệu RegEx 1

Chúng ta cũng có thể đơn giản hóa nó để,

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$

Bản giới thiệu RegEx 2


Nếu bạn muốn đơn giản hóa / sửa đổi / khám phá biểu thức, nó sẽ được giải thích trên bảng trên cùng bên phải của regex101.com . Nếu bạn muốn, bạn cũng có thể xem trong liên kết này , cách nó phù hợp với một số đầu vào mẫu.


Mạch RegEx

jex.im hình dung các biểu thức thông thường:

nhập mô tả hình ảnh ở đây

Kiểm tra

const regex = /^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$/gm;
const str = `hi jack here is james
hi james here is jack
hi james jack here is jack james
hi jack james here is james jack
hi jack jack here is jack james
hi james james here is james jack
hi jack jack jack here is james
`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}


PHƯƠNG PHÁP 2: Một jackvà Một jamestheo thứ tự cụ thể

Nó cũng có thể được thiết kế cho lần đầu tiên jamescuối cùng jack, tương tự như sau:

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b.*\bjack\b).*$

RegEx Demo 3

và ngược lại:

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjack\b.*\bjames\b).*$

Bản giới thiệu RegEx 4


0

Bạn có thể sử dụng tính năng định lượng của regex vì lookaroundcó thể không được hỗ trợ mọi lúc.

(\b(james|jack)\b.*){2,}
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.