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).*$
vim
cú pháp: ^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$
hoặc\v^(.*<jack>)@=(.*<james>)@=.*$
^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$
không phù hợp blah #tgif blah #friday blah
nhưng ^(?=.*\bfriday\b)(?=.*\btgif\b).*$
hoạt động tốt.
\b
nghĩa là gì ở đây?
Thử:
james.*jack
Nếu bạn muốn cả hai cùng một lúc, thì or
chú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.*james
hoặ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 jack
và 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 .
jack
và Mộtjames
Chỉ trong trường hợp, hai jack
hoặc hai james
sẽ không được phép, chỉ một jack
và một james
là 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}`);
});
}
jack
và Một james
theo thứ tự cụ thểNó cũng có thể được thiết kế cho lần đầu tiên james
cuố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).*$