Удаление пробелов между числами с помощью регулярного выражения в abinitio, если длина равна 9, исключая пробелы - PullRequest
1 голос
/ 20 февраля 2020

Например, если Мой ввод: некоторый текст здесь 345 646 356 некоторый текст 235 5343 Вывод должен быть: некоторый текст здесь 345646356 некоторый текст 235 5343

В этом случае необходимо удалить пробелы между числами если длина равна 9. В противном случае пробелы должны быть такими, как есть.

Я пробовал команду ниже, но она удаляет все пробелы между числами, если длина <9 или> 9.

Ввод: мои данные 345 245 254 и 454 356 34 и

Logi c: final_value = re_replace (final_value, "((? <= \ D) + (? = \ d)) "," "); </p>

Вывод: мои данные 345245254 и 45435634 и

Но мне потребуется вывод, так как мои данные 345245254 и 454 356 34 и

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Это долго, но работает, при условии, что строка не содержит символов \ x00:

out::clean_9_digits(instr)=
begin
  let string(int)[int] strv=string_split_no_empty(instr, " "); // length-prefixed to mark removed elements with "\0"
  let int i=0;
  while (i<length_of(strv))
    if ( not string_is_numeric(strv[i]))
      i = i + 1; // continue
    else
      begin
        let string(int) thisnum = strv[i];
        let int j = i + 1;
        while (j < length_of(strv) && string_is_numeric(strv[j]) )
          begin // concatenate all following numeric elements
            thisnum = string_concat(thisnum,strv[j]);
            j=j+1;
          end;
        if (length_of(thisnum) == 9) // match!
          begin
            strv[i]=thisnum; // replace first element with the 9 digit number
            j = i + 1; // mark remaining numeric elements that were combined
            while (j < length_of(strv) && string_is_numeric(strv[j]) ) 
              begin
                strv[j]="\0";
                j = j + 1;
              end;
          end;
        i=j+1; // continue at next element following numeric elements
      end;

  out :: string_replace(string_join(strv, " "), "\0 ", "");
end;

/*Reformat operation*/
out::reformat(in)=
begin
  out.instr :: in.instr;
  out.outstr :: clean_9_digits(in.instr);
end;
0 голосов
/ 21 февраля 2020

Попробуйте с этим REGEXP (отредактировано):

  re_match_replace_all( str=in.final_value,
                        pattern="(\\D\\s*\\d)\\s*(\\d)\\s*(\\d)\\s*(\\d)\\s*(\\d)\\s*(\\d)\\s*(\\d)\\s*(\\d)\\s*(\\d\\s*\\D)",
                        replace_str="$1$2$3$4$5$6$7$8$9"
                        )

(Это не решает проблему во всех случаях, см. Комментарии)

...