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