Ogólne pytanie

Jak zapobiec dopasowaniu do regexa, jeśli ten wzór został odpowiednio dopasowany N

konkretny przykład

Mam 13-cyfrowy identyfikator rekordu, użytkownik wpisuje się w pole tekstowe, takie jak "123-456-7891011".

Zachowanie, które próbuję kapsułkować, jest dodanie kreska przed czwartymi i 7 cyframi, jak są wpisane. Mam wszystkie javascript wokół obsługi wydarzenia bez problemów.

Zawsze będzie numeryczny - radzę sobie z tym przed tym konkretnym krokiem.

Jestem w stanie szybko dostać regexa wystarczająco dobrze, aby wstawić rozdzielczość, gdy za każdym razem wpisuję N + 4. cyfrę. To, czego potrzebuję, to nie robić tego w dowolnym momencie po drugim "-"

Najbliższy, jaki mam do tej pory w moim imprezie ({x0}}) jest tak daleko:

var addDash = /([^\-\d{3}]*\d{3})(\d+)/;
this.value = this.value.replace(addDash, "$1-$2");

Na przykład wpisanie "1234567891011" wyniki w "123-456-789-101-1", gdzie chcę, to "123-456-7891011".

Istnieje prawdopodobnie inne sposoby , aby obsłużyć tę sytuację (jak {x0}} i join), ale do celów to pytanie trzymajmy się, aby odpowiedzieć z prawidłowym regex Wzór, jeśli taki wzór jest możliwy. Są inne rzeczy, które uczyniłyby ten wzór bardzo przydatny - po prostu nie miałem szczęścia.


Dla jasności , ten wzór zostanie uruchomiony oninput na polu tekstowym - mecz powinien działać na dowolną długość znaków między 1 a 13:

"123456" -> "123-456"
"123456789" -> "123-456-789"
"1234567891011" -> 123-456-7891011"
1
Randy Hall 26 czerwiec 2017, 21:20

4 odpowiedzi

Najlepsza odpowiedź

Używanie REGEX bez dodatkowych JS:

var addDash = /^((\d{3}\-?)(\d{3}\-?)?)(\d)$|^(\d{3})(\d)$/;
this.value = this.value.replace(addDash, "$1$5-$4$6");

Rozpoczynając jako początek łańcucha, dopasuj 3 cyfry za pomocą opcjonalnego "-" i opcjonalnie 3 cyfry, po którym następuje natychmiastową cyfrą na końcu ciągu. Jeśli to się nie pasuje, sprawdź, czy ciąg rozpoczyna się od 3 cyfr następszych bezpośrednio przez końcową cyfrę na końcu ciągu.

Uzyskaj trochę funky z grupami przechwytywania w ciągu Wymień ciąg, aby wykonać żądany format.

0
Randy Hall 26 czerwiec 2017, 19:04
$(function() {
    var txt='1232';
    var addDash = /^(\d{3})-?(\d?\d?\d?)-?(\d*)/;
    $("#test").html(txt.replace(addDash, function(match, capture1, capture2, capture3) {
        var firstDelimiter = (capture1.length == 3 && capture2.length > 0) ? '-' : '';
        var secondDelimiter = (capture2.length == 3 && capture3.length > 0) ? '-' : '';
        return capture1 + firstDelimiter + capture2 + secondDelimiter + capture3;
    }));
})
-3
KristofMols 27 czerwiec 2017, 08:32

Możesz użyć wywołania zwrotnego w Wymiana z niektórym logiką, jak obsługiwać przygraniczki. Ułatwi to, że oczekujesz zachowania.

var values = ['12', '123', '123-4', '123-45', '123-456', '123-456-7', '123-456-7891011'];
var addDash = /^(\d{3})-?(\d?\d?\d?)-?(\d*)/;
values.forEach(function(value) {
  value = value.replace(addDash, function(match, capture1, capture2, capture3) {
    var secondDelimiter = capture2.length == 3 ? '-' : '';
    return capture1 + '-' + capture2 + secondDelimiter + capture3;
  });

})
console.log(values)
1
Piyush 26 czerwiec 2017, 18:51

Użyj Callbacks.

Możesz określić funkcję jako drugi parametr. W takim przypadku funkcja zostanie wywołana po wykonaniu meczu. Wynik funkcji (wartość zwracana) zostanie użyta jako ciąg wymiany.

Rozwiązanie specyficzne dla bieżącej potrzeby byłoby zmienić wzór i zawsze przejść do pełnego dopasowania:

this.value = this.value.replace(/^(\d{3})-?(\d{3})?-?(\d*)$/, function (m, a, b, c) {
    return b ? a + "-" + b + "-" + c : a + "-" + c;
});

Zadanie wykonane.

Jeśli chcesz bardziej ogólne rozwiązanie, możesz użyć zmiennej licznika:

var count = 0;
this.value = this.value.replace(/(\d{3})-?/g, function (m, a) {
    return ++count <= 2 ? a + "-" : m;
});

Ten używa wzoru, który jest mniej dokładny dla tego, czego potrzebujesz, ale jest tam, aby pokazać, jak można uogólnić do różnych sytuacji, w których naprawdę musi ograniczyć liczbę zamienników.


Nawiasem mówiąc, masz niezdyscyplinowanie składni: [^\-\d{3}] robi nie oznacza, co myślisz. Dopasowanie znaku single , która nie jest cyfrą ani żadną z nich: -, { lub }. Wszystko wewnątrz [ ... ] Nawiasy definiuje klasa znaków , dlatego ilościowo takie jak {n} są tam bez znaczenia.

3
Lucas Trzesniewski 26 czerwiec 2017, 18:50