Próbuję wyodrębnić wszystkie znaki tekstowe na początku i kolejne dwie liczby z ciągu. Jeśli ciąg zaczyna się od liczby, chciałbym zamiast tego uzyskać pustą wartość ciągu, aby otrzymana tablica nadal zawierała 3 wartości.


Strunowy: 'M2.55X.45'

Kod: 'M2.55X.45'.match(/(^[a-zA-Z]+)|((\.)?\d+[\/\d. ]*|\d)/g)

Spodziewany: ["M", "2.55", ".45"]

Rzeczywiste (poprawne): ["M", "2.55", ".45"]


Strunowy: '2.55X.45'

Kod: '2.55X.45'.match(/(^[a-zA-Z]+)|((\.)?\d+[\/\d. ]*|\d)/g)

Spodziewany: ["", "2.55", ".45"]

Rzeczywisty: ["2.55", ".45"]

1
Badger 1 kwiecień 2020, 21:39

3 odpowiedzi

Najlepsza odpowiedź

Zamiast tego użyj /^([a-zA-Z]?)(\d*(?:\.\d+)?)[a-zA-Z](\d*(?:\.\d+)?)$/.exec("2.55X.45"). Zwraca to tablicę, w której pierwszy element jest całym dopasowaniem, więc musisz uzyskać dostęp do grup indeksowanych 1, na przykład match [1] dla pierwszej wartości. Możesz to wypróbować tutaj.

3
SuperStormer 1 kwiecień 2020, 19:05

Twoje obecne wyrażenie regularne używa alternatywnej klauzuli (|), która tworzy różne typy grupowania w zależności od tego, która alternatywa jest dopasowana.

Oto przykład (trochę wyczyszczony), który tworzy jawne grupy i sprawia, że poszczególne grupy są opcjonalne.

const regex = /^([a-zA-Z]*)?(\d*(?:\.\d+)?)([a-zA-Z]+)(\d*(?:\.\d+)?)$/

console.log(regex.exec("2.55X.45"))
console.log(regex.exec("M2.55X.45"))

Zwróć uwagę, że usunąłem flagę g, więc wyrażenie regularne nie jest zachowywany.

Użyłem też exec zamiast match do nie odrzucaj grup przechwytywania.

1
Cameron Little 1 kwiecień 2020, 18:55

Możesz spróbować tego wzoru

(\D*)(\d+(?:\.\d+))\D+(\.\d+)

enter image description here

let finder = (str) => {
  return (str.match(/^(\D*)(\d+(?:\.\d+))\D+(\.\d+)/) || []).slice(1)
}

console.log(finder('M2.55X.45'))
console.log(finder("2.55X.45"))
1
Code Maniac 1 kwiecień 2020, 18:57