Typescript разбирает строку на группы цифр как 345-67 и текст со словами и цифрами - PullRequest
0 голосов
/ 10 октября 2018

Моя строка в формате "[111-11] текст здесь с цифрами 111, [222-22-22]; 333-33 текст здесь", и я хочу разобрать, чтобы у меня был код [111-11][222-22-22], [333-33] и соответствующий текст.У меня нет фиксированного сплиттера, за исключением кода xxx-xx или xxx-xx-xx.

Я пытался таким образом, но он не может получить цифры в части desc.\ D получит что угодно, кроме цифр.

let text = "[111-11] text here with digits 111, [222-22-22]; 333-33 text here";
let codes=[];
let result = text.replace(/(\d{3}(-\d{2})+)(\D*)/g,(str, code, c, desc) =>  {      
        desc = desc.trim().replace(/[\[\]']+/g,'');   
       if (code) codes.push({'code':code.trim(),'desc': desc});
        return str;
    }); //parse and split codes

Наконец, я хочу получить результат в этом стиле:

[{code:'111-11', desc:'text here with digits 111'},
{code:'222-22-22', desc:''},
{code:'333-33', desc:'text here'}]

Я очень ценю помощь.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Другой подход:

const Sep = ','
const PatSep = /[,;]/g
// skippng first spaces, then getting the numbers (and ignoring the brackets
// if presents), then gets rest
const PatPart = /^\s*\[?(\d{3}(-\d{2})+)]?(.*)$/


const src =
  "[111-11] text here with digits 111, [222-22-22]; 333-33 text here"

const parse = src => {
  // to avoir differents terminations
  const normalized = src.replace (PatSep, Sep)

  return normalized.split (Sep).reduce((acc, part) => {
    // getting code and desc from part
    const [_, code, __, desc] = part.match (PatPart)

    // accumulating in desired array
    return [
      ...acc,
      {code, desc}
    ]
  }, [])
}

console.log(parse (src))

;)

0 голосов
/ 10 октября 2018

Вы можете выполнить поиск значений в скобках и следующего текста в группах, а также посмотреть на скобки или конец строки.Затем разрушите строку и нажмите нужный объект.

const regex = /\[?(\d{3}(-\d\d)+)\]?(.*?)(?=\[?\d{3}(-\d\d)+\]?|$)/gm;
const str = `[111-11] text here with digits 111, [222-22-22]; 333-33 text here`;
var m,
    code, desc,
    result= [];

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }        
    ({ 1: code, 3: desc } = m);
    result.push({ code, desc })
}
console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...