2016-03-03 11 views
6

Mam wyrażeń regularnych, aby uzyskać @user z textarea. Kiedy użytkownik pisze coś z @, otrzymuję go.dostać tylko ostatni mecz? .match (word)

Mój problem polega na tym, że chcę dostać tylko ostatni mecz, nie wszystkie.

np

Typ użytkownika:

@josh and @marie = want to show @marie 
@josh loves @marie and @anne = show @anne 

mój kod pokazuje tak:

@josh,@marie,@anne 

mogę uzyskać tylko ostatni wpis @something? (Podczas gdy użytkownik pisze)

var word=/@(\w+)/ig; 

$("#comment").on("keyup",function() { 

    var content = $(this).val(); 
    var name = content.match(word); 
    var dataString = name; 

    if(name.length > 0) { 
     $("#result").text(name); 
    } 
    return false(); 
}); 

html

<textarea id=comment>@josh and @marie</textarea> 
<div id=result></div> 

https://jsfiddle.net/dcs5pat8/ (naciśnij na textarea)

+1

Możliwy duplikat [JavaScript RegExp: Czy mogę dostać ostatnią dopasowanego indeksu lub szukaj do tyłu/RightToLeft?] (http://stackoverflow.com/questions/4313918/javascript-regexp-can-i-get-the-last-matched-index-or-search-backwards-righttol) – JJJ

+1

spójrz na to blog.bigbinary.com/2010/03/31/regular-expressions-in-JavaScript.html metoda dopasowania Metoda dopasowania działa dokładnie tak jak metoda exec, jeśli nie przekazano parametru g. Gdy flaga globalna jest włączona, mecz zwraca tablicę zawierającą wszystkie dopasowania. – mfadel

+0

co z wykorzystaniem podciągu? – mfadel

Odpowiedz

4

Poza tym coraz wszystkie mecze i uzyskać ostatni, można użyć grupy przechwytywania uzyskać ostatni mecz:

var word=/.*(@\w+)/i; 
var name = content.match(word)[1]; 

lub za pomocą exec, całość będzie wyglądać:

var word=/.*(@\w+)/i; 

$("#comment").on("input",function() { //changed keyup to input 

var content=$(this).val(); 
var match = word.exec(content); 

if(match){ 
$("#result").text(match[1]); 
} 

}); 

Fiddle

PS, jeśli twoim celem jest bardziej ogólne podejście i trzeba przełączać się między coraz wszystkie słowa i ani jednego, polecam utrzymanie globalnego mecz i coraz ostatni jak w Odpowiedź Jonasa.

+0

Jak można zobaczyć wynik w Fiddle? –

+1

@MrRubix The fiddle używa tego samego podejścia co oryginalny post i reaguje na zdarzenia keyup w polu tekstowym. Nawet użycie klawiszy kierunkowych w polu tekstowym powinno wywołać zdarzenie (@ OP, zamiast keyupu możesz również użyć 'input' lub' change') –

+0

Spróbuję! Czy trudno jest uzyskać ostatni mecz? na przykład użytkownik '@ a'' @ c' i chce dodać '@ b' w środku tego, więc moja tablica będzie miała postać' @ a' '@ c'' @ b', ponieważ b był ostatnim typy. –

1

Zastosowanie ten regex '/ @ (\ w +) $/Ig' Insted z "/ @ (\ w +)/ig".

A wtedy twój kod będzie działał jak zaklęcie. ;)

var word=/@(\w+)$/ig; 

$("#comment").on("keyup",function() { 

var content=$(this).val(); 
var name = content.match(word); 
var dataString = name; 

if(name.length>0){ 
$("#result").text(name); 
} 
return false(); 
}); 

Zobacz usłyszeć https://jsfiddle.net/dcs5pat8/1/

+2

To nie zadziała, jeśli '@ słowo' nie jest ostatnim słowem frazy, tzn. Jeśli masz' @john loves @marie potatoes' twoje regex niczego nie znajdzie. –

4

Moja sugestia jest to, że pokazują tylko ostatni wpis z wyników.

można to zrobić przez zmianę linii: var name = content.match(word);

do

var names = content.match(word).split(','); 
var name = names[names.length - 1]; 

na więcej szczegółów, co to robi, to robi się wszystkie wyniki z regex, niż to zamienia ją w tablicy , dzieląc każde słowo. Następnie przypisuje ostatni element tablicy do zmiennej name.

Mam nadzieję, że było to pomocne.

+0

Próbowałem, ale wygląda na to, że nie działa ... https://jsfiddle.net/dcs5pat8/7/ –

+0

'content.match (word)' już zwraca tablicę, nie ma powodu/potrzeby jej podziału. – JJJ

+1

Nie musisz wstawiać funkcji "split" pod koniec meczu. Miałem zamiar go edytować, ale jest oczekująca edycja. Proszę spojrzeć na to skrzypce: https://jsfiddle.net/dcs5pat8/9/ –

1

lubię odpowiedź gdzie wziąć listę ze wszystkimi nazwiskami @ @ nazwa1 @ name2 i po prostu podzielić się ostatni, ale tutaj to jest krok

//split on @something 
//the penultimate item is our target 
//if there is < 2 items there weren't any @somethings so return '' 
user = (split = "testing @charlie testing".split(/(@[^ ]*)/)).length > 1 ? split.splice(-2,1)[0] : ''; 

https://jsfiddle.net/ek19h0fb/1/

2

Można po prostu wybrać lub pop ostatni mecz w tablicy meczu zwróconej przez .match()

var word=/@(\w+)/ig; 

$("#comment").on("keyup",function() { 

    var content=$(this).val(); 
    var matches = content.match(word); 
    var lastmatch = matches.pop(); 

    //IF YOU NEED TO KEEP INTACT THE VAR MATCHES 
    //var lastmatch = matches[matches.length - 1]; 


    if(name.length>0){ 
     $("#result").text(lastmatch); 
    } 
    return false(); 
}); 

JSFiddle