Mam następujący tekst poniżej. Jak napisać wyrażenie regularne, aby przechwycić cały tekst powiązany REQ_XXX?
To jest moje wyrażenie .*(REQ_.*)\|, ale przechwytuje |3 |4 |5. Chcę tylko, żeby zatrzymało się po pierwszym | widzi.

Mam następujący tekst poniżej. Jak napisać wyrażenie regularne, aby przechwycić cały tekst powiązany REQ_XXX?
To jest moje wyrażenie .*(REQ_.*)\|, ale przechwytuje |3 |4 |5. Chcę tylko, żeby zatrzymało się po pierwszym | widzi.

Odpowiedzi:
Możesz użyć :
.*(REQ_[^|]*)\|
„|” postać będzie wykluczona.
Edytować:
.*(REQ_.*?)\|
Sztuką jest ? mówi wcześniej .* zatrzymać się jak najwcześniej. W ten sposób pierwszy | który kończy zakres .*. To jest dokładnie to, czego chcesz.
Moja stara odpowiedź jest poniżej. To działa dobrze, ale myślę, że powyższe jest właściwą drogą.
Stara odpowiedź:
.* dopasowuje (prawie) wszystko, w tym |. Posługiwać się [^|\n]* dopasować wszystko, ale | i nowa linia.
.*(REQ_[^|]*)\|
\n jest potrzebny, ponieważ czysty [^|]* może rozciągać się na wiele linii. Chyba tego nie chcesz.
Niektóre rozwiązania są już opublikowane w innych odpowiedziach, podam tutaj podsumowanie.
Możesz śledzić wiele podejść tutaj, musisz zdecydować na podstawie swoich potrzeb, z których korzystasz:
.*(REQ_[\w]+)[\s]*\|
[\w]+ pasuje do wszystkich znaków słownych (liter, cyfr i „_”) | nie są uwzględniane w przechwyconym wyniku ( [\s]* jest poza nawiasami) .*(REQ_[^|]+)\|.*(REQ_.+?)\| Jeśli REQ_ zawsze następuje po nim znak słowny, możesz po prostu użyć REQ_w+ lub jeśli nie chcesz się dopasować ABCREQ_123, użyć granica słowa : \bREQ_\w+.