@AndersonGreen, pytanie zostało przedwcześnie zablokowane. Poważnie brakuje odpowiedzi, ponieważ te rozwiązania nie są wykonalne, ponieważ większość wyrażeń regularnych nie rozpoznaje obejścia i kwantyfikatora trybu . Uważam, że kwantyfikator istniał w momencie zadawania pytania.
Czy ktoś wie, dlaczego to się psuje (przynajmniej w JavaScript), gdy próbuję wyszukać ciągi zaczynające się od „#”? ^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$nie pasuje, blah #tgif blah #friday blahale ^(?=.*\bfriday\b)(?=.*\btgif\b).*$działa dobrze.
Przyjęta odpowiedź zadziałała. to również działało idealnie dla mnie. Do wyszukiwania kodu w programie Visual Studio „znajdź wyniki”.
Jogurt The Wise
1
Ten działa dla mnie i jest znacznie bardziej zwięzły i łatwy do zrozumienia niż zaakceptowana odpowiedź!
Kumar Manish
1
Potrzebowałem rozwiązania, które ma tylko dwie nazwy do dopasowania, więc ta odpowiedź jest bardziej zwięzła w tym przypadku. Ale przyjęta odpowiedź staje się bardziej zwięzła powyżej 2, ponieważ liczba „lub” rośnie silnie. Dla 3 nazw byłoby 6 "lub" s, 4 nazwy miałyby 24 "lub" s itd.
WileCau
Poleciłbym rozlenić james.*?jack|jack.*?james . Pomoże to w przypadku dużych tekstów.
Jekis
42
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ż jacknadejdzie.
Na marginesie - mogłeś również edytować odpowiedź @ icyrock (która jest taka sama jak twoja, zaledwie 6 lat wcześniej), twoje wyjaśnienie jest samo w sobie bardzo przydatne.
WoJ
2
Dziękuję za tę odpowiedź, czuję jednak potrzebę zwrócenia uwagi, że w wyszukiwaniu VSCode jest to gniazdo odpowiedzi . * James | james. * jack zajmie spacje między znakami „|” (lub) symbol brany pod uwagę podczas wyszukiwania. jack. * james | james. * jack działa i nie szuka spacji
jgritten
2
JEŚLI $ _explanation === "niesamowite", TO zwraca $ THUMBS_UP ENDIF;
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 jacki 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 .
Na wszelki wypadek, dwa jacklub dwa jamesbyłyby niedozwolone, tylko jeden jacki jeden jamesbyłby ważny, prawdopodobnie możemy zaprojektować wyrażenie podobne do:
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.
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 matchesif(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}`);});}
Odpowiedzi:
Możesz sprawdzić, używając lookarounds :
Sprawdź to.
Takie podejście ma tę zaletę, że można łatwo określić wiele warunków.
źródło
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ć:
Jeśli chcesz mieć oba jednocześnie, to
or
one:źródło
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,
przeszuka
james
, a następnie dowolną liczbę znaków, ażjack
nadejdzie.Ponieważ chcesz albo
jack.*james
lubjames.*jack
Stąd polecenie :
źródło
Jest krótki i słodki
źródło
Możesz to zrobić:
źródło
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
ijames
, 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 .
źródło
METODA 1: Jeden
jack
i jedenjames
Na wszelki wypadek, dwa
jack
lub dwajames
byłyby niedozwolone, tylko jedenjack
i jedenjames
byłby ważny, prawdopodobnie możemy zaprojektować wyrażenie podobne do:Tutaj wykluczylibyśmy te wystąpienia par, używając następujących instrukcji:
i,
Demo RegEx 1
Możemy to również uprościć,
RegEx Demo 2
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.
RegEx Circuit
jex.im wizualizuje wyrażenia regularne:
Test
METODA 2: Jeden
jack
i jedenjames
w określonej kolejnościMoże być również zaprojektowany jako pierwszy
james
ostatnijack
, podobny do następującego:RegEx Demo 3
i wzajemnie:
RegEx Demo 4
źródło
Możesz skorzystać z funkcji kwantyfikatora wyrażeń regularnych, ponieważ
lookaround
może nie być obsługiwana przez cały czas.źródło