Как замаскировать первые 6 и последние 4 цифры для номера кредитной карты в .net - PullRequest
0 голосов
/ 21 февраля 2019

Я очень новичок в регулярных выражениях. И я пытаюсь использовать регулярное выражение, чтобы превратить номер кредитной карты, который будет частью разговора, во что-то вроде 492900 ******2222* 1001 *

Поскольку это может происходить из любого разговора, он может содержать строку рядом с ним или может иметь несовместимый формат, поэтому по существу все нижеприведенное должно быть отформатировано в приведенном выше примере:

  • привет, мой номер: 492900001111222
  • число: 4929000011112222ok?
  • 4929 0000 1111 2222
  • 4929-0000-1111-2222

Это должно быть регулярное выражение, которое извлекаетгруппа захвата, которую я затем смогу использовать MatchEvaluator, чтобы превратить все цифры (исключая не цифры), которые не являются первыми 6 и последними 4, в *

Я видел много примеров здесь по переполнению стекадля PHP и JS, но ни один, который не помогает мне решить эту проблему.

Будем благодарны за любые рекомендации

ОБНОВЛЕНИЕ

Мне нужно расширить существующийяПлементация, которая использует MatchEvaluator для маскировки каждого символа, который не является первым 6 или последним 4, и в идеале я не хочу менять MatchEvaluator и просто сделать гибкую маскировку на основе регулярного выражения, см. это для примера https://dotnetfiddle.net/J2LCo0

ОБНОВЛЕНИЕ 2

@Matt.G и ответы @CAustin действительно решают то, о чем я просил, но я сталкиваюсь с другим барьером, где я не могу быть настолько строгим.Конечная захваченная группа должна учитывать только цифры и, следовательно, поддерживать формат входного текста.Так, например:

Если в некоторых номерах моей карты указан номер 99 9988 8877776666, результат оценки должен составить 99 9988 ****** 666666

ИЛИ номер моей карты 9999-8888-7777-6666 должно выдать 9999-88 ** - **** - 6666.

Возможно ли это?

Изменен список для включения элементов, которые находятся в моих модульных тестах https://dotnetfiddle.net/tU6mxQ

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Если производительность является проблемой, вот схема, которая проходит только 94 шага, вместо 473 другого ответа, избегая обхода и чередования:

\d{4}[ -]?\d{2}\K\d{2}[ -]?\d{4}

Демонстрация: https://regex101.com/r/0XMluq/4

Редактировать: В варианте регулярного выражения C # вместо этого можно использовать следующий шаблон, так как C # допускает просмотр переменной длины.

(?<=\d{4}[ -]?\d{2})\d{2}[ -]?\d{4}

Demo

0 голосов
/ 21 февраля 2019

Попробуйте Regex: (?<=\d{4}\d{2})\d{2}\d{4}(?=\d{4})|(?<=\d{4}( |-)\d{2})\d{2}\1\d{4}(?=\1\d{4})

Regex Demo

C # Demo

Объяснение:

2 alternative regexes
(?<=\d{4}\d{2})\d{2}\d{4}(?=\d{4}) - to handle cardnumbers without any separators (- or <space>)
(?<=\d{4}( |-)\d{2})\d{2}\1\d{4}(?=\1\d{4}) - to handle cardnumbers with separator (- or <space>)

1st Alternative (?<=\d{4}\d{2})\d{2}\d{4}(?=\d{4})
    Positive Lookbehind (?<=\d{4}\d{2}) - matches text that has 6 digits immediately behind it
    \d{2} matches a digit (equal to [0-9])
        {2} Quantifier — Matches exactly 2 times
    \d{4} matches a digit (equal to [0-9])
        {4} Quantifier — Matches exactly 4 times
    Positive Lookahead (?=\d{4}) - matches text that is followed immediately by 4 digits
        Assert that the Regex below matches
            \d{4} matches a digit (equal to [0-9])
            {4} Quantifier — Matches exactly 4 times

2nd Alternative (?<=\d{4}( |-)\d{2})\d{2}\1\d{4}(?=\1\d{4})

    Positive Lookbehind (?<=\d{4}( |-)\d{2}) - matches text that has (4 digits followed by a separator followed by 2 digits) immediately behind it
    1st Capturing Group ( |-) - get the separator as a capturing group, this is to check the next occurence of the separator using \1
    \1 matches the same text as most recently matched by the 1st capturing group (separator, in this case)
    Positive Lookahead (?=\1\d{4}) - matches text that is followed by separator and 4 digits
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...