/ / Jak dokonać kwantyfikacji grupy w regex Javascript? [duplicate] - javascript, regex, regex-group, quantifiers

Jak policzyć grupę w wyrażeniu regularnym JavaScript? [duplicate] - javascript, regex, regex-group, quantifiers

Powiedzmy, że mam ciąg "QQxaxbxcQQ" i jachciałem uchwycić wszystkie grupy x, a następnie dowolną postać. Chcę również wyszukiwać między QQ (ciąg może zawierać inne rzeczy w nim) .Myślałem, że to zadziałało:

var matches = str.match(/QQ(xw)+QQ/)

Jednak wydaje mi się, że to tylko powrót do ostatniego meczu (xc). Czy możesz wskazać mi właściwy kierunek?

EDYCJA: pierwsza wersja mojego pytania została uproszczona. Przeprosiny za oryginalne odpowiedzi. Zmieniono tak, aby był bliżej mojego rzeczywistego problemu.

Odpowiedzi:

1 dla odpowiedzi № 1

Operator + jest chciwy. /(xw)+/ powinien pasować do całego ciągu "xaxbxc", a grupa przechwytująca będzie zawierała końcową wartość pasującą do (xw) składnik. W tym przypadku "xc". Jeśli chcesz uchwycić każdy kolejny mecz, /(xw)+/ zamiast tego powinno być /((?:xw)+)/. Spowoduje to przesunięcie grupy przechwytywania wokół sekwencji zamiast w niej. The (?: ) reprezentuje grupę niezapisującą.

EDYTOWAĆ:

Jeśli chcesz każde wystąpienie (xw), nie tylko kolejne instancje, nie używaj operatora + ani grup przechwytujących. Wystarczy użyć globalnego wyrażenia regularnego: /xw/g.

"QQxaxbQQxcQQ".match(/xw/g) plony ["xa, "xb", "xc"].

"QQxaxbQQxcQQ".match(/((?:xw)+)/) plony ["xaxb", "xaxb"].

EDYCJA 2:

Jeśli chcesz szukać tylko pomiędzy QQs, a split powinna być najszybszą metodą. (Podkreślenie bardzo pomaga.)

_.chain("xyQQxaxbQQxcQQxr".split("QQ"))
.slice(1, -1)
.map(function (string) {
return string.match(/xw/g);
})
.flatten()
.compact()
.value()

daje ["xa", "xb", "xc"]


1 dla odpowiedzi nr 2

Musisz tylko dodać g parametr na końcu Twojego wyrażenia regularnego. g flag zwraca tablicę zawierającą wszystkie dopasowania, w naszym przypadku wszystkie dopasowania wstecznej referencji (xw)

W tekście pogrubionym: / QQ (xw) + QQ /sol

var matches = str.match(/QQ(xw)+QQ/g)

mecze to tablica

Spójrz na to: http://jsfiddle.net/SZRSA/3/


0 dla odpowiedzi № 3
"xaxbxc".match(/xw/g);

który wraca

["xa", "xb", "xc"]

Ponieważ PO zmienił pytanie. teraz jest to duplikacja Wyrażenia regularne i podpasma JavaScript.


0 dla odpowiedzi nr 4

Być może chodzi o zawijanie powtórzeń w grupie przechwytującej (przechwytywanie wszystkich instancji xw połączone razem):

var matches = str.match(/QQ((xw)+)QQ/)

To się zwraca "xaxbxc" tak jak matches[1]


0 dla odpowiedzi № 5

Jeśli chcesz przechwycić wszystkie grupy, użyj tego:

var matches = str.match(/(xw)/g)

wyjście:

["xa", "xb", "xc"]

Wprowadziłem dwie zmiany:

  • usunięto + ponieważ wydaje się, że chcesz, aby każde x było poprzedzone jednym znakiem
  • dodano g modyfikator, aby poprosić o wszystkie grupy

Odniesienie


EDYCJA: jeśli chcesz dostać swoje mecze tylko wtedy, gdy są pomiędzy QQ i QQ, możesz to zrobić:

var matches = str.split("QQ").filter(function(v,i){return i%2})
.join(" ").match(/(xw)/g)