/ / JavaScript Regex do przechwytywania powtarzającej się części dziesiętnej - javascript, regex

JavaScript Regex do przechwytywania powtarzającej się części dziesiętnej - javascript, regex

Szukasz najlepszego sposobu na pobranie dowolnej liczby z potencjalnie powtarzającą się częścią dziesiętną i odkryj powtarzającą się część (jeśli jest obecna).

Ostatecznie muszę ozdobić liczbę notacją overline (albo tekstową dekoracją css lub mline MathML), więc muszę znać indeks, od którego zaczyna się również powtórzenie.

Potrzebuję więc wyrażenia regularnego, które da mi (lub może być użyte w algorytmie, aby uzyskać) następujące wyniki:

1.333 // result: {"pattern": 3, index: 0}
1.5444 // result: {"pattern": 4, index: 1}
1.123123 // result: {"pattern": 123, index: 0}
1.5432121212 // result: {"pattern": 12, index: 4}
1.321 // result: null
1.44212 // result: null

Dodatkowy przykład (z komentarzy):

1.3333 // result: { "pattern": 3, index: 0}

Odpowiedzi:

3 dla odpowiedzi № 1
function getRepetend(num) {
var m = (num+"").match(/.(d*?)(d+?)2+$/);
return m && {pattern: +m[2], index: m[1].length};
}

Działa to tak:

  • Najpierw przekonwertuj liczbę na ciąg, aby móc używać wyrażeń regularnych.
  • Następnie dopasuj wyrażenie regularne: /.(d*?)(d+)2+$/:
    • . dopasowuje kropkę dziesiętną.
    • (d*?) dopasowuje cyfry między kropką dziesiętną a powtórzeniem i przechwytuje wynik do wstecznego numeru 1.
    • (d+?) dopasowuje powtórzenie i przechwytuje je do referencji numer 2.
    • 2+ dopasowuje powtórzenia powtórzenia.
    • $ dopasowuje koniec łańcucha.
  • Wreszcie, jeśli mecz jest null (tzn. nie ma dopasowania), powrót null.
  • W przeciwnym razie zwróć obiekt zawierający powtórzenie (odwołanie wsteczne 2) przekonwertowane na liczbę oraz liczbę cyfr między kropką a powtórzeniem (odwołanie wsteczne 1).

4 dla odpowiedzi nr 2

Możesz spróbować czegoś takiego:

(d+?)1+$

http://regex101.com/r/eX8eC3/3

Dopasował pewną liczbę cyfr, a następnie używa znakuodwołanie wsteczne, aby spróbować dopasować ten sam zestaw natychmiast potem 1 lub więcej razy. Jest zakotwiczony na końcu łańcucha, ponieważ w przeciwnym razie zostanie on wyzwolony przez, na przykład:

1.5432121212

To by zobaczyło 21 powtarzanie zamiast 12.

Dodawanie ? do pierwszej grupy, która to zrobi niezachłanny powinien rozwiązać problem z 1.3333 jak podniesiony przez Louisa.


3 dla odpowiedzi nr 3

Możesz użyć tego wyrażenia regularnego z RexExp#exec I użyć result.index w wynikowym obiekcie:

var re = /(d+)1$/;
var s = ".5439876543212211211";

var result = re.exec( s );
console.log ( result.index );
//=> 14

console.log ( result[1] );
//=> 211

JsFiddle Demo


1 dla odpowiedzi nr 4
(.+)(?:1)+$

Wypróbuj to. Sprawdź wersję demonstracyjną.

http://regex101.com/r/uH3tP3/10