Regex dopasowuje wszystkie kombinacje

1

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.

enter image description here

user3719021
źródło
Myślę, że powinieneś usunąć i opublikować w Stackoverflow.
johnny
3
Jeśli możemy odpowiedzieć na to pytanie, powinno być dobrze. RegEx jest prawdopodobnie szarym obszarem między kodowaniem a pracą aplikacji.
music2myear

Odpowiedzi:

2

Możesz użyć :

.*(REQ_[^|]*)\|

„|” postać będzie wykluczona.

Alix
źródło
Zastanów się nad dodaniem referencji wspierających to, co sam określasz.
Pimp Juice IT
2

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.

Kamil Maciorowski
źródło
1

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:

  1. podaj pozytywną listę znaków pojawiających się w kodzie:
    .*(REQ_[\w]+)[\s]*\|
    • w tym przypadku [\w]+ pasuje do wszystkich znaków słownych (liter, cyfr i „_”)
    • białe znaki wcześniej | nie są uwzględniane w przechwyconym wyniku ( [\s]* jest poza nawiasami)
  2. podaj negatywną listę znaków, w której chcesz, aby zatrzymało się wyrażenie regularne:
    .*(REQ_[^|]+)\|
  3. użyj leniwego meczu, aby zatrzymać się przy pierwszej możliwości: .*(REQ_.+?)\|
Máté Juhász
źródło
0

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+.

Zobacz w akcji

Toto
źródło