Мені потрібні логічні І в регулярних виразах.
щось на зразок
джек І джеймс
погоджуються з наступними рядками
"привіт Джек ось Джеймс "
"привіт Джеймс, ось Джек "
Мені потрібні логічні І в регулярних виразах.
щось на зразок
джек І джеймс
погоджуються з наступними рядками
"привіт Джек ось Джеймс "
"привіт Джеймс, ось Джек "
Відповіді:
Ви можете робити перевірки за допомогою lookarounds :
^(?=.*\bjack\b)(?=.*\bjames\b).*$
Такий підхід має ту перевагу, що ви можете легко вказати кілька умов.
^(?=.*\bjack\b)(?=.*\bjames\b)(?=.*\bjason\b)(?=.*\bjules\b).*$
vim
синтаксис: ^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$
або\v^(.*<jack>)@=(.*<james>)@=.*$
^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$
не відповідає, blah #tgif blah #friday blah
але ^(?=.*\bfriday\b)(?=.*\btgif\b).*$
працює чудово.
\b
тут означає?
Спробуйте:
james.*jack
Якщо ви хочете обох одночасно, то or
їх:
james.*jack|jack.*james
james.*?jack|jack.*?james
. Це допоможе у великих текстах.
Пояснення команди, яку я збираюся написати : -
.
означає, що на зміну може прийти будь-який символ, цифра.
*
означає нуль або більше випадків речі, написаної безпосередньо перед нею.
|
означає "або" .
Так,
james.*jack
буде шукати james
, то будь-яка кількість символів доjack
настане.
Так як ви хочете jack.*james
абоjames.*jack
Звідси командування :
jack.*james|james.*jack
Його коротке і солодке
(?=.*jack)(?=.*james)
Ви можете зробити:
\bjack\b.*\bjames\b|\bjames\b.*\bjack\b
Vim має оператора філії \&
який корисний при пошуку рядка, що містить набір слів, у будь-якому порядку. Більше того, розширення набору необхідних слів є тривіальним.
Наприклад,
/.*jack\&.*james
буде відповідати рядку, що містить jack
і james
в будь-якому порядку.
Дивіться цю відповідь для отримання додаткової інформації про використання. Мені не відомий жоден інший аромат регексу, який реалізує розгалуження; Оператор навіть не задокументований у вікіпедії Regular Expression .
jack
і одинjames
На випадок, якщо два jack
чи два james
не будуть дозволені, лише один jack
і один james
буде дійсним, ми можемо створити вираз, подібний до:
^(?!.*\bjack\b.*\bjack\b)(?!.*\bjames\b.*\bjames\b)(?=.*\bjames\b)(?=.*\bjack\b).*$
Тут ми би виключили ці екземпляри пари, які використовують ці оператори:
(?!.*\bjack\b.*\bjack\b)
і,
(?!.*\bjames\b.*\bjames\b)
Ми також можемо спростити це,
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$
Якщо ви хочете спростити / змінити / вивчити вираз, це було пояснено на верхній правій панелі regex101.com . Якщо ви хочете, ви також можете подивитися за цим посиланням , як це буде відповідати деяким зразкам даних.
jex.im візуалізує регулярні вирази:
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
і один james
у визначеному порядкуВін може бути також розрахований на першому james
Останнє jack
, подібно наступного:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b.*\bjack\b).*$
і навпаки:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjack\b.*\bjames\b).*$