Potrzebuję logicznego AND w wyrażeniu regularnym.
coś jak
jack AND james
zgadzają się z następującymi ciągami
„cześć jack, tu jest james ”
„cześć james, tu jest jack ”
Potrzebuję logicznego AND w wyrażeniu regularnym.
coś jak
jack AND james
zgadzają się z następującymi ciągami
„cześć jack, tu jest james ”
„cześć james, tu jest jack ”
Odpowiedzi:
Możesz sprawdzić, używając lookarounds :
^(?=.*\bjack\b)(?=.*\bjames\b).*$
Takie podejście ma tę zaletę, że można łatwo określić wiele warunków.
^(?=.*\bjack\b)(?=.*\bjames\b)(?=.*\bjason\b)(?=.*\bjules\b).*$
vim
składnia: ^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$
lub\v^(.*<jack>)@=(.*<james>)@=.*$
^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$
nie pasuje, blah #tgif blah #friday blah
ale ^(?=.*\bfriday\b)(?=.*\btgif\b).*$
działa dobrze.
\b
znaczy?
Próbować:
james.*jack
Jeśli chcesz mieć oba jednocześnie, to or
one:
james.*jack|jack.*james
james.*?jack|jack.*?james
. Pomoże to w przypadku dużych tekstów.
Wyjaśnienie polecenia, które mam zamiar napisać : -
.
oznacza dowolny znak, cyfra może zastąpić.
*
oznacza zero lub więcej wystąpień rzeczy napisanej tuż przed tym.
|
oznacza „lub” .
Więc,
james.*jack
przeszuka james
, a następnie dowolną liczbę znaków, aż jack
nadejdzie.
Ponieważ chcesz albo jack.*james
lubjames.*jack
Stąd polecenie :
jack.*james|james.*jack
Jest krótki i słodki
(?=.*jack)(?=.*james)
Vim ma operatora oddziału \&
który jest przydatny podczas wyszukiwania linii zawierającej zestaw słów w dowolnej kolejności. Ponadto rozszerzenie zestawu wymaganych słów jest banalne.
Na przykład,
/.*jack\&.*james
dopasuje wiersz zawierający jack
i james
, w dowolnej kolejności.
Zobacz tę odpowiedź, aby uzyskać więcej informacji na temat użytkowania. Nie znam żadnego innego rodzaju wyrażenia regularnego, który implementuje rozgałęzianie; operator nie jest nawet udokumentowany we wpisie w Wikipedii dotyczącym wyrażeń regularnych .
jack
i jedenjames
Na wszelki wypadek, dwa jack
lub dwa james
byłyby niedozwolone, tylko jeden jack
i jeden james
byłby ważny, prawdopodobnie możemy zaprojektować wyrażenie podobne do:
^(?!.*\bjack\b.*\bjack\b)(?!.*\bjames\b.*\bjames\b)(?=.*\bjames\b)(?=.*\bjack\b).*$
Tutaj wykluczylibyśmy te wystąpienia par, używając następujących instrukcji:
(?!.*\bjack\b.*\bjack\b)
i,
(?!.*\bjames\b.*\bjames\b)
Możemy to również uprościć,
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$
Jeśli chcesz uprościć / zmodyfikować / zbadać wyrażenie, zostało to wyjaśnione w prawym górnym panelu regex101.com . Jeśli chcesz, możesz również obejrzeć w tym linku , jak to będzie się zgadzać z niektórymi przykładowymi danymi wejściowymi.
jex.im wizualizuje wyrażenia regularne:
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
i jeden james
w określonej kolejnościMoże być również zaprojektowany jako pierwszy james
ostatni jack
, podobny do następującego:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b.*\bjack\b).*$
i wzajemnie:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjack\b.*\bjames\b).*$