Альтернатива позитивному взгляду за - PullRequest
0 голосов
/ 19 апреля 2020

Я только что обнаружил, что позитивный взгляд не работает в старых браузерах, и я застрял с этой проблемой в IE11, т.е. Неожиданный квантификатор

регулярное выражение: /(?<=\d{4})\d(?=\d{4})/g

string.replace(/(?<=\d{4})\d(?=\d{4})/g, "#");

ожидаемый результат: 4444########1111

любая альтернатива этому регулярному выражению будет полезной .

Ответы [ 3 ]

0 голосов
/ 19 апреля 2020

Если ваша строка состоит только из цифр , вам действительно не нужно регулярное выражение, все, что вам нужно, это пара методов манипуляции со строками:

// Adapted from https://stackoverflow.com/a/5450113/3832970, count will always be positive here
function strRepeat(pattern, count) {
    var result = '';
    while (count > 1) {
        if (count & 1) result += pattern;
        count >>= 1, pattern += pattern;
    }
    return result + pattern;
};

var string = "4444333322221111";
console.log(
    string.substring(0,4) + strRepeat("#", string.length-8) + string.slice(-4)
)

Если вам нужно замаскировать цифры, заключенные в четыре цифры с обеих сторон в более длинную строку , вы можете использовать:

function strRepeat(pattern, count) {
    var result = '';
    while (count > 1) {
        if (count & 1) result += pattern;
        count >>= 1, pattern += pattern;
    }
    return result + pattern;
};

var string = "111109876543210000 abc 1234012345678904321";
console.log(
  string.replace(/\d{9,}/g, function(match) { 
     return match.substr(0,4) + strRepeat("#", match.length-8) + match.slice(-4); 
  })
)

Здесь

  • /\d{9,}/g соответствует все вхождения из девяти или более цифр
  • function(match) {...} - метод обратного вызова, который принимает совпадение с регулярным выражением, и вы можете управлять выводом здесь
  • match.substr(0,4) + "#".repeat(match.length-8) + match.slice(-4) - объединяет первые 4 цифры, затем к ним добавляются цифры, которые необходимо заменить на #, и затем добавляются оставшиеся 4 цифры.

Если вы хотите, вы можете сделать шаблон регулярного выражения с захватом групп , это сделает метод обратного вызова немного меньше, но сделает регулярное выражение длиннее:

function strRepeat(pattern, count) {
    var result = '';
    while (count > 1) {
        if (count & 1) result += pattern;
        count >>= 1, pattern += pattern;
    }
    return result + pattern;
};

var string = "111109876543210000 abc 1234012345678904321";
console.log(
  string.replace(/(\d{4})(\d+)(\d{4})/g, function($0, $1, $2, $3) { 
     return $1 + strRepeat("#", $2.length-8) + $3; 
  })
)

Здесь шаблон (\d{4})(\d+)(\d{4}) захватит 4 цифры в Группе 1 ($1), затем цифры 1+ будут записаны в Группе 2 ($2) и затем 4 цифры будут включены в группу 3 ($3).

0 голосов
/ 19 апреля 2020

Ваша строка ввода выглядит как номер платежной карты. Вам не нужно регулярное выражение, вы можете использовать простые функции обработки строк, такие как String.substring() и конкатенация строк.

Например:

const str = '1111222233334444';
const masked = str.substring(0, 4) + 
   '#'.repeat(str.length - 8) + 
   str.substring(str.length - 4)
console.log(masked);

Решение для регулярных выражений не требует использования поиска:

const str = '1111222233334444';
const masked = str.replace(/^(\d{4})(\d*)(\d{4})$/,
  `$1${"#".repeat(str.length - 8)}$3`);
console.log(masked);
0 голосов
/ 19 апреля 2020

Вы можете взять функцию и индекс и заменить либо на di git для первых четырех цифр, либо на #.

var string = '4444333322221111';

console.log(string.replace(/\d(?=\d{4})/g, function (v, i) { return i < 4 ? v : '#'; }));

Обновление с нарезанными строками.

var string = '4444333322221111',
    result =
        string.slice(0, 4) +
        string.slice(4, -4).replace(/./g, '#') +
        string.slice(-4);

console.log(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...