Как использовать регулярные выражения для анализа строки в определенном формате в Javascript? - PullRequest
1 голос
/ 26 сентября 2019

У меня есть несколько строк, как показано ниже

ab.ab.c,ab.d,bc.e,mt

bc.e,nmt

ef.1,mt

Я хочу использовать regex, чтобы определенным образом проанализировать эти строки и получить результат

Например

ab.ab.c,ab.d,bc.e,mt

val1 = ab  (take the value prior to first dot)
val2 = ab.c,ab.d,bc.e (take the value after first dot but before the last comma)
val3 = mt (take value after the last comma)

Аналогично

bc.e,nmt

val1 = bc (take the value prior to first dot)
val2 = e (take the value after first dot but before the last comma)
val3 = nmt (take value after the last comma)

ef.1,mt

val1 = ef
val2 = 1
val3 = mt

Теперь мой подход довольно длинный и неэффективный.Это то, что я делаю

let val3 = someString.split(',').slice(-1)[0]
let remaining_string = someString.replace("," + val3, "")

let val1 = remaining_string.slice(0, remaining_string.indexOf('.'))    

let val2 = null
if(remaining_string.split(",").length > 1) {
    val2 = remaining_string.replace("."+val1, "")
 }
 else {
    val2 = remaining_string.split(".")[1]
 }

Есть ли какой-нибудь вкладыш или более чистое решение для быстрого получения val1, val2 и val3?

Ответы [ 3 ]

3 голосов
/ 26 сентября 2019

Вы можете использовать общее регулярное выражение для сопоставления и захвата 1) любых символов 1+ в начале строки в группе 1, 2) любых символов после первого несловарного символа в группе 2 до последнего появленияне-слово char 3), а затем любые символы 1+ в конце строки.

 /^(\w+)\W(.*)\W(\w+)$/

См. демонстрацию regex

ПРИМЕЧАНИЕ: Если разделители являются фиксированными символами, используйте /^(\w+)\.(.*),(\w+)$/.

JS demo:

var rx = /^(\w+)\W(.*)\W(\w+)$/;
var ss = ["ab.ab.c,ab.d,bc.e,mt", "bc.e,nmt", "ef.1,mt"];
for (var i=0; i<ss.length; i++) {
  var m = ss[i].match(rx);
  if (m) {
     console.log([m[1], m[2], m[3]]);
  }
}
3 голосов
/ 26 сентября 2019

Сначала найдите индексы первая точка и последняя запятая .

var idxPeriod = someString.indexOf(".");
var idxComma = someString.lastIndexOf(",");

Затем используйте метод substring() для извлечения необходимой части.

var val1 = someString.substring(0, idxPeriod);
var val2 = someString.substring(idxPeriod + 1, idxComma);
var val3 = someString.substring(idxComma + 1);
0 голосов
/ 26 сентября 2019

Я не очень опытен с RegEx, так что может быть лучшее решение, но мне кажется, что это работает:)

val1 = string.match(/^[^\.]*/)[0];
val2 = string.match(/(?:\.)+(.*)(?:,)/)[1];
val3 = string.match(/[^,]*?$/)[0];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...