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 '
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 '
Câu trả lời:
Bạn có thể thực hiện kiểm tra bằng cách sử dụng lookaround :
^(?=.*\bjack\b)(?=.*\bjames\b).*$
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).*$
vimcú pháp: ^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$hoặc\v^(.*<jack>)@=(.*<james>)@=.*$
^(?=.*\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.
\bnghĩa là gì ở đây?
Thử:
james.*jack
Nếu bạn muốn cả hai cùng một lúc, thì orchúng:
james.*jack|jack.*james
james.*?jack|jack.*?james. Điều này sẽ giúp trên các văn bản lớn.
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.
Vì bạn muốn jack.*jameshoặcjames.*jack
Do đó lệnh :
jack.*james|james.*jack
Nó ngắn và ngọt ngào
(?=.*jack)(?=.*james)
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 jackvà james, 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 .
jackvà MộtjamesChỉ 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)
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).*$
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.
jex.im hình dung các biểu thức thông thường:
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}`);
});
}
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).*$
và ngược lại:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjack\b.*\bjames\b).*$