Мне нужно логическое И в регулярных выражениях.
что-то вроде
Джек и Джеймс
согласен со следующими строками
«Привет, Джек, вот Джеймс »
«Привет, Джеймс, это Джек »
Мне нужно логическое И в регулярных выражениях.
что-то вроде
Джек и Джеймс
согласен со следующими строками
«Привет, Джек, вот Джеймс »
«Привет, Джеймс, это Джек »
Ответы:
Вы можете делать проверки, используя обходные пути :
^(?=.*\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)
В Vim есть оператор ветвления, \&который полезен при поиске строки, содержащей набор слов в любом порядке. Более того, расширение набора необходимых слов тривиально.
Например,
/.*jack\&.*james
будет соответствовать строке, содержащей jackи james, в любом порядке.
Смотрите этот ответ для получения дополнительной информации об использовании. Я не знаю ни одного другого варианта регулярного выражения, который реализует ветвление; оператор даже не задокументирован в записи Википедии о регулярных выражениях .
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).*$