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 № 1Operator + 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 QQ
s, 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
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)