2015-11-12 13 views
6

Mam następujące wyrażenia regularnego:Wykluczenie ostatniego znaku regex meczu

%(?:\\.|[^%\\ ])*%([,;\\\s]) 

że działa świetnie, ale oczywiście to także podkreśla następny znak do ostatniego %.

Zastanawiam się, jak mogę wyłączyć to z regex?

Na przykład, jeśli mam:

The files under users\%username%\desktop\ are: 

To podkreśli %username%\ ale po prostu chcę %username%. Z drugiej strony, jeśli mogę zostawić regex tak:

%(?:\\.|[^%\\ ])*% 

... to będzie pasować do tego wzoru, że nie chcę, aby:

%example1%example2%example3 

Każdy pomysł jak wykluczyć ostatnia postać w meczu przez wyrażenie regularne?

+0

Myślę, że znalazłem rozwiązanie z zupełnie nowym RegEx ... przepraszam za opublikowanie tego zbyt wcześnie! Czyni to, czego potrzebuję ... '% (?: \\.| [^ "% \ d \\]) *%' – user3587624

+0

To wyrażenie nie jest skuteczne, ponieważ masz alternatywną grupę z zastosowanym kwantyfikatorem .Jeśli to nie jest problem (łańcuchy, które masz krótkie), to jest OK. Jeśli mogą być nieco dłuższe, musisz je rozwinąć. Zobacz [to demo] (https://regex101.com/r/aM2cY3/1) - 6 kroków w stosunku do 30. –

Odpowiedz

3
%(?:\\.|[^%\\ ])*%(?=[,;\\\s]) 

        ^^ 

Użyj lookahead .Co trzeba tutaj jest 0 width assertion który niczego nie uchwycić.

1

Można użyć bardziej efektywnego wyrażenia regularnego niż obecnie używane. Gdy używana jest alternacja razem z kwantyfikatorem, występuje niepotrzebne cofanie.

Jeśli masz ciąg krótkich łańcuchów, możesz go użyć. Jeśli jednak mogą być nieco dłuższe, może być konieczne "rozwinięcie" wyrażenia.

Oto jak to zrobić:

%[^"\\%]*(?:\\.[^"\\%]*)*% 

Regex podział:

  • % - wstępne procent znak
  • [^"\\%]* - początek rozwiniętym wzoru: 0 lub więcej znaków innych niż podwójny cytat, ukośnik odwrotny i znak procentowy
  • (?:\\.[^"\\%]*)* - 0 lub więcej sekwencji ...
    • \\. - dosłowny odwrotny ukośnik następuje dowolny znak inny niż znak nowej linii
    • [^"\\%]* - 0 lub więcej znaków innych niż podwójny cudzysłów, backslash i procentowego znak
  • % - krocząca procent znak

Zobacz this demo - 6 kroków w porównaniu z 30 krokami z urządzeniem %(?:\\.|[^" %\d\\])*%.

+0

Proszę sprawdzić moją odpowiedź, mam nadzieję, że pomoże ci lepiej zrozumieć regex Więcej o tym, jak [rozwinąć pętlę w regex można znaleźć tutaj] (http://www.softec.lu/site/RegularExpressions/UnrollingTheLoop). Miłego dnia. –

Powiązane problemy