1. Наш подход

Мы строго соблюдаем законодательство в области охраны и обработки ПДн. В связи с этим, сообщаем:

  1. Все серверы, задействованные в проекте физически находятся в стране клиента.
  2. Сервис не собирает, не хранит, не обрабатывает персональные, медицинские, биометрические, (никакие!) конфиденциальные данные.
  3. На уровне ядра проекта, исключён любой доступ со стороны Мониторинга к внутренним ИТ-системам, корпоративной и коммерческой тайне наших клиентов.

Наше кредо - только деперсонифицированный трафик!


Выполнение этого условие достигается с двух сторон.

На стороне LC.Мониторинг данная реализация выполнена во всех архитектурных слоях.


Настоятельно рекомендуем разработчику перед отправкой запроса в Мониторинг проводить аналогичную деперсонификацию у себя в коде, этим самым, исключая возможность отправки конфиденциальной информации!!


Таким образом, сервис работает строго в правовом и быстро адаптируется под законодательство страны (или стран) эксплуатации.

2. Реализация

Чтобы стандартизировать и упростить этот важный процесс, приводим несколько примеров на одних из самых распространенных языков программирования.

Важно! Вы вправе дополнять код новыми правилами по своему усмотрению, но текущий код не может быть уменьшен и\или исправлен.

2.1 Python

import re

def hide_sensitive_info(text):
    mask = f"[скрытые данные]"
    # Поиск и замена СНИЛС
    snils_pattern = r"\d{3}[ -.]?\d{3}[ -.]?\d{3}[ -.]?\d{2}"
    text = re.sub(snils_pattern, mask, text)

    # Поиск и замена номера полиса ОМС
    oms_pattern = r"\d{16}"
    text = re.sub(oms_pattern, mask, text)

    # Поиск и замена паспорта
    passport_pattern = r"\d{4} \d{6}"
    text = re.sub(passport_pattern, mask, text)

    # Поиск и замена e-mail
    email_pattern = r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b"
    text = re.sub(email_pattern, mask, text)

    # Поиск и замена телефона
    phone_pattern = r"\+\d{1,3}\s?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{2}[-.\s]?\d{2}"
    text = re.sub(phone_pattern, mask, text)

    # Поиск и замена номера полиса ДМС
    dms_pattern = r"[A-Z]{2}\d{9}"
    text = re.sub(dms_pattern, mask, text)

    # Поиск и замена номера военного билета
    military_id_pattern = r"[A-Z]{2}\d{7}"
    text = re.sub(military_id_pattern, mask, text)

    # Поиск и замена номера пенсионного удостоверения
    pension_id_pattern = r"\d{10}"
    text = re.sub(pension_id_pattern, mask, text)

    # Поиск и замена ИНН
    inn_pattern = r"\d{10}"
    text = re.sub(inn_pattern, mask, text)

    # Поиск и замена адреса
    address_pattern = r"\d+\s+[\w\s]+\s+(?:St\.?|Ave\.?|Rd\.?|Blvd\.?|Ln\.?)"
    text = re.sub(address_pattern, mask, text)

    return text

2.2 Go

func hideSensitiveInfo(text string) string {
    mask := "[скрытые данные]"

    snilsPattern := regexp.MustCompile(`\d{3}[ -.]?\d{3}[ -.]?\d{3}[ -.]?\d{2}`)
    text = snilsPattern.ReplaceAllString(text, mask)

    omsPattern := regexp.MustCompile(`\d{16}`)
    text = omsPattern.ReplaceAllString(text, mask)

    passportPattern := regexp.MustCompile(`\d{4} \d{6}`)
    text = passportPattern.ReplaceAllString(text, mask)

    // Replace special characters in the email pattern
    emailPattern := regexp.MustCompile(`\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b`)

    text = emailPattern.ReplaceAllString(text, mask)

    phonePattern := regexp.MustCompile(`\+\d{1,3}\s?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{2}[-.\s]?\d{2}`)
    text = phonePattern.ReplaceAllString(text, mask)

    dmsPattern := regexp.MustCompile(`[A-Z]{2}\d{9}`)
    text = dmsPattern.ReplaceAllString(text, mask)

    militaryIDPattern := regexp.MustCompile(`[A-Z]{2}\d{7}`)
    text = militaryIDPattern.ReplaceAllString(text, mask)

    pensionIDPattern := regexp.MustCompile(`\d{10}`)
    text = pensionIDPattern.ReplaceAllString(text, mask)

    innPattern := regexp.MustCompile(`\d{10}`)
    text = innPattern.ReplaceAllString(text, mask)

    addressPattern := regexp.MustCompile(`\d+\s+[\w\s]+\s+(?:St\.?|Ave\.?|Rd\.?|Blvd\.?|Ln\.?)`)
    text = addressPattern.ReplaceAllString(text, mask)

    return text
}

2.3 PHP

Общий код

<?php

function hide_sensitive_info($text) {
    $mask = "[скрытые данные]";

    // Поиск и замена СНИЛС
    $text = preg_replace("/\d{3}[ -.]?\d{3}[ -.]?\d{3}[ -.]?\d{2}/", $mask, $text);

    // Поиск и замена номера полиса ОМС
    $text = preg_replace("/\d{16}/", $mask, $text);

    // Поиск и замена паспорта
    $text = preg_replace("/\d{4} \d{6}/", $mask, $text);

    // Поиск и замена e-mail
    $text = preg_replace("/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/", $mask, $text);

    // Поиск и замена телефона
    $text = preg_replace("/\+\d{1,3}\s?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{2}[-.\s]?\d{2}/", $mask, $text);

    // Поиск и замена номера полиса ДМС
    $text = preg_replace("/[A-Z]{2}\d{9}/", $mask, $text);

    // Поиск и замена номера военного билета
    $text = preg_replace("/[A-Z]{2}\d{7}/", $mask, $text);

    // Поиск и замена номера пенсионного удостоверения
    $text = preg_replace("/\d{10}/", $mask, $text);

    // Поиск и замена ИНН
    $text = preg_replace("/\d{10}/", $mask, $text);

    // Поиск и замена адреса
    $text = preg_replace("/\d+\s+[\w\s]+\s+(?:St\.?|Ave\.?|Rd\.?|Blvd\.?|Ln\.?)/", $mask, $text);

    return $text;
}

?>

2.3.1 Native

<?php
    // Пример использования общего кода для PHP. Деперсонификация данных LC.Мониторинг
    $original_text = "Исходные данные: СНИЛС 123-456-789-01, e-mail: test@example.com";
    $processed_text = hide_sensitive_info($original_text);
    echo $processed_text;
?>

2.3.2 Symphony

<?php
    // Пример использования Symphony Controller. Деперсонификация данных LC.Мониторинг
    use Symfony\Component\HttpFoundation\Response;

    class YourController
    {
        public function yourAction()
        {
            // Пример использования
            $originalText = "Исходные данные: СНИЛС 123-456-789-01, e-mail: test@example.com";
            $processedText = hideSensitiveInfo($originalText);

            return new Response($processedText);
        }
    }
?>

2.3.3 Yii

<?php
    // Пример использования Yii Controller. Деперсонификация данных LC.Мониторинг
    class YourController extends Controller
    {
        public function actionYourAction()
        {
            // Пример использования
            $originalText = "Исходные данные: СНИЛС 123-456-789-01, e-mail: test@example.com";
            $processedText = hideSensitiveInfo($originalText);

            return $this->render('your-view', ['processedText' => $processedText]);
        }
    }
?>

2.3.4 Laravel

<?php
    // Laravel Controller
    use Illuminate\Http\Request;

    class YourController extends Controller
    {
        public function yourAction(Request $request)
        {
            // Пример использования
            $originalText = "Исходные данные: СНИЛС 123-456-789-01, e-mail: test@example.com";
            $processedText = hideSensitiveInfo($originalText);

            return response()->json(['processedText' => $processedText]);
        }
    }
?>

2.3.5 Bitrix D7

<?php

use Bitrix\Main\Loader;

Loader::includeModule('main');

function hide_sensitive_info($text)
{
    $mask = "[скрытые данные]";

    // Поиск и замена СНИЛС
    $text = preg_replace("/\d{3}[ -.]?\d{3}[ -.]?\d{3}[ -.]?\d{2}/", $mask, $text);

    // Поиск и замена номера полиса ОМС
    $text = preg_replace("/\d{16}/", $mask, $text);

    // Поиск и замена паспорта
    $text = preg_replace("/\d{4} \d{6}/", $mask, $text);

    // Поиск и замена e-mail
    $text = preg_replace("/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/", $mask, $text);

    // Поиск и замена телефона
    $text = preg_replace("/\+\d{1,3}\s?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{2}[-.\s]?\d{2}/", $mask, $text);

    // Поиск и замена номера полиса ДМС
    $text = preg_replace("/[A-Z]{2}\d{9}/", $mask, $text);

    // Поиск и замена номера военного билета
    $text = preg_replace("/[A-Z]{2}\d{7}/", $mask, $text);

    // Поиск и замена номера пенсионного удостоверения
    $text = preg_replace("/\d{10}/", $mask, $text);

    // Поиск и замена ИНН
    $text = preg_replace("/\d{10}/", $mask, $text);

    // Поиск и замена адреса
    $text = preg_replace("/\d+\s+[\w\s]+\s+(?:St\.?|Ave\.?|Rd\.?|Blvd\.?|Ln\.?)/", $mask, $text);

    return $text;
}

// Пример использования
$original_text = "Исходные данные: СНИЛС 123-456-789-01, e-mail: test@example.com";
$processed_text = hide_sensitive_info($original_text);
echo $processed_text;

?>

2.4 Java

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HideSensitiveInfo {

    public static String hideSensitiveInfo(String text) {
        String mask = "[скрытые данные]";

        // Поиск и замена СНИЛС
        text = text.replaceAll("\\d{3}[ -.]?\\d{3}[ -.]?\\d{3}[ -.]?\\d{2}", mask);

        // Поиск и замена номера полиса ОМС
        text = text.replaceAll("\\d{16}", mask);

        // Поиск и замена паспорта
        text = text.replaceAll("\\d{4} \\d{6}", mask);

        // Поиск и замена e-mail
        text = text.replaceAll("\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b", mask);

        // Поиск и замена телефона
        text = text.replaceAll("\\+\\d{1,3}\\s?\\(\\d{3}\\)?[-.\\s]?\\d{3}[-.\\s]?\\d{2}[-.\\s]?\\d{2}", mask);

        // Поиск и замена номера полиса ДМС
        text = text.replaceAll("[A-Z]{2}\\d{9}", mask);

        // Поиск и замена номера военного билета
        text = text.replaceAll("[A-Z]{2}\\d{7}", mask);

        // Поиск и замена номера пенсионного удостоверения
        text = text.replaceAll("\\d{10}", mask);

        // Поиск и замена ИНН
        text = text.replaceAll("\\d{10}", mask);

        // Поиск и замена адреса
        text = text.replaceAll("\\d+\\s+[\\w\\s]+\\s+(?:St\\.?|Ave\\.?|Rd\\.?|Blvd\\.?|Ln\\.?)", mask);

        return text;
    }

    // Пример использования
    public static void main(String[] args) {
        String originalText = "Исходные данные: СНИЛС 123-456-789-01, e-mail: test@example.com";
        String processedText = hideSensitiveInfo(originalText);
        System.out.println(processedText);
    }
}

2.5 JavaScript

2.5.1 JS Native

function hideSensitiveInfo(text) {
    const mask = "[скрытые данные]";

    // Поиск и замена СНИЛС
    text = text.replace(/\d{3}[ -.]?\d{3}[ -.]?\d{3}[ -.]?\d{2}/g, mask);

    // Поиск и замена номера полиса ОМС
    text = text.replace(/\d{16}/g, mask);

    // Поиск и замена паспорта
    text = text.replace(/\d{4} \d{6}/g, mask);

    // Поиск и замена e-mail
    text = text.replace(/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/g, mask);

    // Поиск и замена телефона
    text = text.replace(/\+\d{1,3}\s?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{2}[-.\s]?\d{2}/g, mask);

    // Поиск и замена номера полиса ДМС
    text = text.replace(/[A-Z]{2}\d{9}/g, mask);

    // Поиск и замена номера военного билета
    text = text.replace(/[A-Z]{2}\d{7}/g, mask);

    // Поиск и замена номера пенсионного удостоверения
    text = text.replace(/\d{10}/g, mask);

    // Поиск и замена ИНН
    text = text.replace(/\d{10}/g, mask);

    // Поиск и замена адреса
    text = text.replace(/\d+\s+[\w\s]+\s+(?:St\.?|Ave\.?|Rd\.?|Blvd\.?|Ln\.?)/g, mask);

    return text;
}

// Пример использования
const originalText = "Исходные данные: СНИЛС 123-456-789-01, e-mail: test@example.com";
const processedText = hideSensitiveInfo(originalText);
console.log(processedText);

2.5.2 jQuery

function hideSensitiveInfo(text) {
    const mask = "[скрытые данные]";

    // Поиск и замена СНИЛС
    text = text.replace(/\d{3}[ -.]?\d{3}[ -.]?\d{3}[ -.]?\d{2}/g, mask);

    // Поиск и замена номера полиса ОМС
    text = text.replace(/\d{16}/g, mask);

    // Поиск и замена паспорта
    text = text.replace(/\d{4} \d{6}/g, mask);

    // Поиск и замена e-mail
    text = text.replace(/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/g, mask);

    // Поиск и замена телефона
    text = text.replace(/\+\d{1,3}\s?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{2}[-.\s]?\d{2}/g, mask);

    // Поиск и замена номера полиса ДМС
    text = text.replace(/[A-Z]{2}\d{9}/g, mask);

    // Поиск и замена номера военного билета
    text = text.replace(/[A-Z]{2}\d{7}/g, mask);

    // Поиск и замена номера пенсионного удостоверения
    text = text.replace(/\d{10}/g, mask);

    // Поиск и замена ИНН
    text = text.replace(/\d{10}/g, mask);

    // Поиск и замена адреса
    text = text.replace(/\d+\s+[\w\s]+\s+(?:St\.?|Ave\.?|Rd\.?|Blvd\.?|Ln\.?)/g, mask);

    return text;
}

// Пример использования
const originalText = "Исходные данные: СНИЛС 123-456-789-01, e-mail: test@example.com";
const processedText = hideSensitiveInfo(originalText);
console.log(processedText);

2.5.3 Node.JS

function hideSensitiveInfo(text) {
    const mask = "[скрытые данные]";

    // Поиск и замена СНИЛС
    text = text.replace(/\d{3}[ -.]?\d{3}[ -.]?\d{3}[ -.]?\d{2}/g, mask);

    // Поиск и замена номера полиса ОМС
    // ... аналогично для остальных полей

    console.log(text);
}

// Пример использования
const originalText = "Исходные данные: СНИЛС 123-456-789-01, e-mail: test@example.com";
hideSensitiveInfo(originalText);

2.5.4 React

function hideSensitiveInfo(text) {
    const mask = "[скрытые данные]";

    // Поиск и замена СНИЛС
    text = text.replace(/\d{3}[ -.]?\d{3}[ -.]?\d{3}[ -.]?\d{2}/g, mask);

    // Поиск и замена номера полиса ОМС
    text = text.replace(/\d{16}/g, mask);

    // Поиск и замена паспорта
    text = text.replace(/\d{4} \d{6}/g, mask);

    // Поиск и замена e-mail
    text = text.replace(/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/g, mask);

    // Поиск и замена телефона
    text = text.replace(/\+\d{1,3}\s?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{2}[-.\s]?\d{2}/g, mask);

    // Поиск и замена номера полиса ДМС
    text = text.replace(/[A-Z]{2}\d{9}/g, mask);

    // Поиск и замена номера военного билета
    text = text.replace(/[A-Z]{2}\d{7}/g, mask);

    // Поиск и замена номера пенсионного удостоверения
    text = text.replace(/\d{10}/g, mask);

    // Поиск и замена ИНН
    text = text.replace(/\d{10}/g, mask);

    // Поиск и замена адреса
    text = text.replace(/\d+\s+[\w\s]+\s+(?:St\.?|Ave\.?|Rd\.?|Blvd\.?|Ln\.?)/g, mask);

    return text;
}

// Пример использования
const originalText = "Исходные данные: СНИЛС 123-456-789-01, e-mail: test@example.com";
const processedText = hideSensitiveInfo(originalText);
console.log(processedText);

2.5.5 TypeScript

type HideSensitiveInfoProps = {
  originalText: string;
};

const HideSensitiveInfo: React.FC<HideSensitiveInfoProps> = ({ originalText }) => {
  const [processedText, setProcessedText] = React.useState<string>(originalText);

  const hideSensitiveInfo = () => {
    const mask = "[скрытые данные]";

    // Замена СНИЛС
    let newText = processedText.replace(/\d{3}[ -.]?\d{3}[ -.]?\d{3}[ -.]?\d{2}/g, mask);

    // Замена номера полиса ОМС
    newText = newText.replace(/\d{16}/g, mask);

    // Замена паспорта
    newText = newText.replace(/\d{4} \d{6}/g, mask);

    // Замена e-mail
    newText = newText.replace(/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/g, mask);

    // Замена телефона
    newText = newText.replace(/\+\d{1,3}\s?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{2}[-.\s]?\d{2}/g, mask);

    // Замена номера полиса ДМС
    newText = newText.replace(/[A-Z]{2}\d{9}/g, mask);

    // Замена номера военного билета
    newText = newText.replace(/[A-Z]{2}\d{7}/g, mask);

    // Замена номера пенсионного удостоверения
    newText = newText.replace(/\d{10}/g, mask);

    // Замена ИНН
    newText = newText.replace(/\d{10}/g, mask);

    // Замена адреса
    newText = newText.replace(/\d+\s+[\w\s]+\s+(?:St\.?|Ave\.?|Rd\.?|Blvd\.?|Ln\.?)/g, mask);

    setProcessedText(newText);
  };

  return (
    <div>
      <p>Исходный текст: {originalText}</p>
      <button onClick={hideSensitiveInfo}>Скрыть чувствительные данные</button>
      <p>Обработанный текст: {processedText}</p>
    </div>
  );
};

export default HideSensitiveInfo;

2.6 C++

#include <iostream>
#include <regex>

void hide_sensitive_info(std::string& text) {
    std::string mask = "[скрытые данные]";

    // Поиск и замена СНИЛС
    std::regex snils_regex("\\d{3}[ -.]?\\d{3}[ -.]?\\d{3}[ -.]?\\d{2}");
    text = std::regex_replace(text, snils_regex, mask);

    // Поиск и замена номера полиса ОМС
    // ... аналогично для остальных полей

    std::cout << text << std::endl;
}

int main() {
    std::string original_text = "Исходные данные: СНИЛС 123-456-789-01, e-mail: test@example.com";
    hide_sensitive_info(original_text);
    return 0;
}

2.7 C

#include <stdio.h>
#include <stdlib.h>
#include <regex.h>

void hide_sensitive_info(char *text) {
    char *mask = "[скрытые данные]";

    // Поиск и замена СНИЛС
    regex_t regex;
    regcomp(&regex, "\\d{3}[ -.]?\\d{3}[ -.]?\\d{3}[ -.]?\\d{2}", REG_EXTENDED);
    regexec(&regex, text, 0, NULL, 0);
    regfree(&regex);

    // Поиск и замена номера полиса ОМС
    // ... аналогично для остальных полей

    printf("%s\n", text);
}

int main() {
    char original_text[] = "Исходные данные: СНИЛС 123-456-789-01, e-mail: test@example.com";
    hide_sensitive_info(original_text);
    return 0;
}

2.8 C Sharp

using System;
using System.Text.RegularExpressions;

public class SensitiveInfoHider
{
    public string HideSensitiveInfo(string text)
    {
        string mask = "[скрытые данные]";

        // Поиск и замена СНИЛС
        text = Regex.Replace(text, @"\d{3}[ -.]?\d{3}[ -.]?\d{3}[ -.]?\d{2}", mask);

        // Поиск и замена номера полиса ОМС
        text = Regex.Replace(text, @"\d{16}", mask);

        // Поиск и замена паспорта
        text = Regex.Replace(text, @"\d{4} \d{6}", mask);

        // Поиск и замена e-mail
        text = Regex.Replace(text, @"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b", mask);

        // Поиск и замена телефона
        text = Regex.Replace(text, @"\+\d{1,3}\s?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{2}[-.\s]?\d{2}", mask);

        // Поиск и замена номера полиса ДМС
        text = Regex.Replace(text, @"[A-Z]{2}\d{9}", mask);

        // Поиск и замена номера военного билета
        text = Regex.Replace(text, @"[A-Z]{2}\d{7}", mask);

        // Поиск и замена номера пенсионного удостоверения
        text = Regex.Replace(text, @"\d{10}", mask);

        // Поиск и замена ИНН
        text = Regex.Replace(text, @"\d{10}", mask);

        // Поиск и замена адреса
        text = Regex.Replace(text, @"\d+\s+[\w\s]+\s+(?:St\.?|Ave\.?|Rd\.?|Blvd\.?|Ln\.?)", mask);

        return text;
    }

    public static void Main()
    {
        SensitiveInfoHider hider = new SensitiveInfoHider();

        // Пример использования
        string originalText = "Исходные данные: СНИЛС 123-456-789-01, e-mail: test@example.com";
        string processedText = hider.HideSensitiveInfo(originalText);

        Console.WriteLine(processedText);
    }
}

2.9 Objective C

#import <Foundation/Foundation.h>

NSString* hideSensitiveInfo(NSString* text) {
    NSString* mask = @"[скрытые данные]";

    // Поиск и замена СНИЛС
    NSRegularExpression* snilsPattern = [NSRegularExpression regularExpressionWithPattern:@"\\d{3}[ -.]?\\d{3}[ -.]?\\d{3}[ -.]?\\d{2}" options:0 error:nil];
    text = [snilsPattern stringByReplacingMatchesInString:text options:0 range:NSMakeRange(0, [text length]) withTemplate:mask];

    // Поиск и замена номера полиса ОМС
    NSRegularExpression* omsPattern = [NSRegularExpression regularExpressionWithPattern:@"\\d{16}" options:0 error:nil];
    text = [omsPattern stringByReplacingMatchesInString:text options:0 range:NSMakeRange(0, [text length]) withTemplate:mask];

    // Поиск и замена паспорта
    NSRegularExpression* passportPattern = [NSRegularExpression regularExpressionWithPattern:@"\\d{4} \\d{6}" options:0 error:nil];
    text = [passportPattern stringByReplacingMatchesInString:text options:0 range:NSMakeRange(0, [text length]) withTemplate:mask];

    // Поиск и замена e-mail
    NSRegularExpression* emailPattern = [NSRegularExpression regularExpressionWithPattern:@"\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b" options:0 error:nil];
    text = [emailPattern stringByReplacingMatchesInString:text options:0 range:NSMakeRange(0, [text length]) withTemplate:mask];

    // Поиск и замена телефона
    NSRegularExpression* phonePattern = [NSRegularExpression regularExpressionWithPattern:@"\\+\\d{1,3}\\s?\\(\\d{3}\\)?[-.\\s]?\\d{3}[-.\\s]?\\d{2}[-.\\s]?\\d{2}" options:0 error:nil];
    text = [phonePattern stringByReplacingMatchesInString:text options:0 range:NSMakeRange(0, [text length]) withTemplate:mask];

    // Поиск и замена номера полиса ДМС
    NSRegularExpression* dmsPattern = [NSRegularExpression regularExpressionWithPattern:@"[A-Z]{2}\\d{9}" options:0 error:nil];
    text = [dmsPattern stringByReplacingMatchesInString:text options:0 range:NSMakeRange(0, [text length]) withTemplate:mask];

    // Поиск и замена номера военного билета
    NSRegularExpression* militaryIdPattern = [NSRegularExpression regularExpressionWithPattern:@"[A-Z]{2}\\d{7}" options:0 error:nil];
    text = [militaryIdPattern stringByReplacingMatchesInString:text options:0 range:NSMakeRange(0, [text length]) withTemplate:mask];

    // Поиск и замена номера пенсионного удостоверения
    NSRegularExpression* pensionIdPattern = [NSRegularExpression regularExpressionWithPattern:@"\\d{10}" options:0 error:nil];
    text = [pensionIdPattern stringByReplacingMatchesInString:text options:0 range:NSMakeRange(0, [text length]) withTemplate:mask];

    // Поиск и замена ИНН
    NSRegularExpression* innPattern = [NSRegularExpression regularExpressionWithPattern:@"\\d{10}" options:0 error:nil];
    text = [innPattern stringByReplacingMatchesInString:text options:0 range:NSMakeRange(0, [text length]) withTemplate:mask];

    // Поиск и замена адреса
    NSRegularExpression* addressPattern = [NSRegularExpression regularExpressionWithPattern:@"\\d+\\s+[\\w\\s]+\\s+(?:St\\.?|Ave\\.?|Rd\\.?|Blvd\\.?|Ln\\.?)" options:0 error:nil];
    text = [addressPattern stringByReplacingMatchesInString:text options:0 range:NSMakeRange(0, [text length]) withTemplate:mask];

    return text;
}

// Пример использования
NSString* originalText = @"Исходные данные: СНИЛС 123-456-789-01, e-mail: test@example.com";
NSString* processedText = hideSensitiveInfo(originalText);
NSLog(@"%@", processedText);

2.10 Swift

import Foundation

func hideSensitiveInfo(text: String) -> String {
    let mask = "[скрытые данные]"

    // Поиск и замена СНИЛС
    let snilsPattern = try! NSRegularExpression(pattern: "\\d{3}[ -.]?\\d{3}[ -.]?\\d{3}[ -.]?\\d{2}")
    let snilsRange = NSRange(location: 0, length: text.utf16.count)
    let snilsReplacement = snilsPattern.stringByReplacingMatches(in: text, options: [], range: snilsRange, withTemplate: mask)

    // Поиск и замена номера полиса ОМС
    let omsPattern = try! NSRegularExpression(pattern: "\\d{16}")
    let omsRange = NSRange(location: 0, length: snilsReplacement.utf16.count)
    let omsReplacement = omsPattern.stringByReplacingMatches(in: snilsReplacement, options: [], range: omsRange, withTemplate: mask)

    // Поиск и замена паспорта
    let passportPattern = try! NSRegularExpression(pattern: "\\d{4} \\d{6}")
    let passportRange = NSRange(location: 0, length: omsReplacement.utf16.count)
    let passportReplacement = passportPattern.stringByReplacingMatches(in: omsReplacement, options: [], range: passportRange, withTemplate: mask)

    // Поиск и замена e-mail
    let emailPattern = try! NSRegularExpression(pattern: "\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b")
    let emailRange = NSRange(location: 0, length: passportReplacement.utf16.count)
    let emailReplacement = emailPattern.stringByReplacingMatches(in: passportReplacement, options: [], range: emailRange, withTemplate: mask)

    // Поиск и замена телефона
    let phonePattern = try! NSRegularExpression(pattern: "\\+\\d{1,3}\\s?\\(\\d{3}\\)?[-.\\s]?\\d{3}[-.\\s]?\\d{2}[-.\\s]?\\d{2}")
    let phoneRange = NSRange(location: 0, length: emailReplacement.utf16.count)
    let phoneReplacement = phonePattern.stringByReplacingMatches(in: emailReplacement, options: [], range: phoneRange, withTemplate: mask)

    // Поиск и замена номера полиса ДМС
    let dmsPattern = try! NSRegularExpression(pattern: "[A-Z]{2}\\d{9}")
    let dmsRange = NSRange(location: 0, length: phoneReplacement.utf16.count)
    let dmsReplacement = dmsPattern.stringByReplacingMatches(in: phoneReplacement, options: [], range: dmsRange, withTemplate: mask)

    // Поиск и замена номера военного билета
    let militaryIdPattern = try! NSRegularExpression(pattern: "[A-Z]{2}\\d{7}")
    let militaryIdRange = NSRange(location: 0, length: dmsReplacement.utf16.count)
    let militaryIdReplacement = militaryIdPattern.stringByReplacingMatches(in: dmsReplacement, options: [], range: militaryIdRange, withTemplate: mask)

    // Поиск и замена номера пенсионного удостоверения
    let pensionIdPattern = try! NSRegularExpression(pattern: "\\d{10}")
    let pensionIdRange = NSRange(location: 0, length: militaryIdReplacement.utf16.count)
    let pensionIdReplacement = pensionIdPattern.stringByReplacingMatches(in: militaryIdReplacement, options: [], range: pensionIdRange, withTemplate: mask)

    // Поиск и замена ИНН
    let innPattern = try! NSRegularExpression(pattern: "\\d{10}")
    let innRange = NSRange(location: 0, length: pensionIdReplacement.utf16.count)
    let innReplacement = innPattern.stringByReplacingMatches(in: pensionIdReplacement, options: [], range: innRange, withTemplate: mask)

    // Поиск и замена адреса
    let addressPattern = try! NSRegularExpression(pattern: "\\d+\\s+[\\w\\s]+\\s+(?:St\\.?|Ave\\.?|Rd\\.?|Blvd\\.?|Ln\\.?)")
    let addressRange = NSRange(location: 0, length: innReplacement.utf16.count)
    let addressReplacement = addressPattern.stringByReplacingMatches(in: innReplacement, options: [], range: addressRange, withTemplate: mask)

    return addressReplacement
}

// Пример использования
let originalText = "Исходные данные: СНИЛС 123-456-789-01, e-mail: test@example.com"
let processedText = hideSensitiveInfo(text: originalText)
print(processedText)

2.11 1C

Для языка 1C (1C:Enterprise), работа с текстовыми данными может быть осуществлена с использованием языка выражений:

Функция СкрытьЧувствительнуюИнформацию(Текст)

    Маска = "[скрытые данные]";

    // Поиск и замена СНИЛС
    Текст = ЗаменитьСтрокуРегВыр(Текст, "\d{3}[ -.]?\d{3}[ -.]?\d{3}[ -.]?\d{2}", Маска);

    // Поиск и замена номера полиса ОМС
    Текст = ЗаменитьСтрокуРегВыр(Текст, "\d{16}", Маска);

    // Поиск и замена паспорта
    Текст = ЗаменитьСтрокуРегВыр(Текст, "\d{4} \d{6}", Маска);

    // Поиск и замена e-mail
    Текст = ЗаменитьСтрокуРегВыр(Текст, "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b", Маска);

    // Поиск и замена телефона
    Текст = ЗаменитьСтрокуРегВыр(Текст, "\+\d{1,3}\s?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{2}[-.\s]?\d{2}", Маска);

    // Поиск и замена номера полиса ДМС
    Текст = ЗаменитьСтрокуРегВыр(Текст, "[A-Z]{2}\d{9}", Маска);

    // Поиск и замена номера военного билета
    Текст = ЗаменитьСтрокуРегВыр(Текст, "[A-Z]{2}\d{7}", Маска);

    // Поиск и замена номера пенсионного удостоверения
    Текст = ЗаменитьСтрокуРегВыр(Текст, "\d{10}", Маска);

    // Поиск и замена ИНН
    Текст = ЗаменитьСтрокуРегВыр(Текст, "\d{10}", Маска);

    // Поиск и замена адреса
    Текст = ЗаменитьСтрокуРегВыр(Текст, "\d+\s+[\w\s]+\s+(?:St\.?|Ave\.?|Rd\.?|Blvd\.?|Ln\.?)", Маска);

    Возврат Текст;

КонецФункции

Пример использования:

    ТекстДанных = "Исходные данные: СНИЛС 123-456-789-01, e-mail: test@example.com";
    ТекстДанных = СкрытьЧувствительнуюИнформацию(ТекстДанных);
    Сообщить(ТекстДанных);

2.12 Kotlin

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import kotlinx.android.synthetic.main.activity_main.*
import java.util.regex.Pattern

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val originalText = "Исходные данные: СНИЛС 123-456-789-01, e-mail: test@example.com"

        // Пример использования
        val processedText = hideSensitiveInfo(originalText)
        textView.text = processedText
    }

    private fun hideSensitiveInfo(text: String): String {
        val mask = "[скрытые данные]"

        // Замена СНИЛС
        var newText = text.replace(Regex("\\d{3}[ -.]?\\d{3}[ -.]?\\d{3}[ -.]?\\d{2}"), mask)

        // Замена номера полиса ОМС
        newText = newText.replace(Regex("\\d{16}"), mask)

        // Замена паспорта
        newText = newText.replace(Regex("\\d{4} \\d{6}"), mask)

        // Замена e-mail
        newText = newText.replace(Regex("\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b"), mask)

        // Замена телефона
        newText = newText.replace(Regex("\\+\\d{1,3}\\s?\\(\\d{3}\\)?[-.\\s]?\\d{3}[-.\\s]?\\d{2}[-.\\s]?\\d{2}"), mask)

        // Замена номера полиса ДМС
        newText = newText.replace(Regex("[A-Z]{2}\\d{9}"), mask)

        // Замена номера военного билета
        newText = newText.replace(Regex("[A-Z]{2}\\d{7}"), mask)

        // Замена номера пенсионного удостоверения
        newText = newText.replace(Regex("\\d{10}"), mask)

        // Замена ИНН
        newText = newText.replace(Regex("\\d{10}"), mask)

        // Замена адреса
        newText = newText.replace(Regex("\\d+\\s+[\\w\\s]+\\s+(?:St\\.?|Ave\\.?|Rd\\.?|Blvd\\.?|Ln\\.?)"), mask)

        return newText
    }
}

2.13 Perl

sub hide_sensitive_info {
    my ($text) = @_;

    my $mask = "[скрытые данные]";

    # Поиск и замена СНИЛС
    $text =~ s/\d{3}[ -.]?\d{3}[ -.]?\d{3}[ -.]?\d{2}/$mask/g;

    # Поиск и замена номера полиса ОМС
    $text =~ s/\d{16}/$mask/g;

    # Поиск и замена паспорта
    $text =~ s/\d{4} \d{6}/$mask/g;

    # Поиск и замена e-mail
    $text =~ s/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/$mask/g;

    # Поиск и замена телефона
    $text =~ s/\+\d{1,3}\s?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{2}[-.\s]?\d{2}/$mask/g;

    # Поиск и замена номера полиса ДМС
    $text =~ s/[A-Z]{2}\d{9}/$mask/g;

    # Поиск и замена номера военного билета
    $text =~ s/[A-Z]{2}\d{7}/$mask/g;

    # Поиск и замена номера пенсионного удостоверения
    $text =~ s/\d{10}/$mask/g;

    # Поиск и замена ИНН
    $text =~ s/\d{10}/$mask/g;

    # Поиск и замена адреса
    $text =~ s/\d+\s+[\w\s]+\s+(?:St\.?|Ave\.?|Rd\.?|Blvd\.?|Ln\.?)/$mask/g;

    return $text;
}

# Пример использования
my $original_text = "Исходные данные: СНИЛС 123-456-789-01, e-mail: test@example.com";
my $processed_text = hide_sensitive_info($original_text);
print $processed_text . "\n";

Для скрытия чувствительной информации в JSON-пакетах на Perl вы можете использовать следующий код:

use JSON;

sub hide_sensitive_info_in_json {
    my ($json_string) = @_;

    my $json_data = decode_json($json_string);

    # Заменить чувствительную информацию в JSON
    $json_data->{snils} =~ s/\d{3}[ -.]?\d{3}[ -.]?\d{3}[ -.]?\d{2}/[скрытые данные]/g;
    $json_data->{oms_number} =~ s/\d{16}/[скрытые данные]/g;
    $json_data->{passport} =~ s/\d{4} \d{6}/[скрытые данные]/g;
    $json_data->{email} =~ s/\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/[скрытые данные]/g;
    $json_data->{phone} =~ s/\+\d{1,3}\s?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{2}[-.\s]?\d{2}/[скрытые данные]/g;
    $json_data->{dms_number} =~ s/[A-Z]{2}\d{9}/[скрытые данные]/g;
    $json_data->{military_id} =~ s/[A-Z]{2}\d{7}/[скрытые данные]/g;
    $json_data->{pension_id} =~ s/\d{10}/[скрытые данные]/g;
    $json_data->{inn} =~ s/\d{10}/[скрытые данные]/g;
    $json_data->{address} =~ s/\d+\s+[\w\s]+\s+(?:St\.?|Ave\.?|Rd\.?|Blvd\.?|Ln\.?)/[скрытые данные]/g;

    return encode_json($json_data);
}

# Пример использования
my $original_json = '{"snils": "123-456-789-01", "email": "test@example.com"}';
my $processed_json = hide_sensitive_info_in_json($original_json);
print $processed_json . "\n";

В этом примере функция hide_sensitive_info_in_json принимает строку JSON, декодирует ее в структуру данных Perl, заменяет чувствительную информацию и затем кодирует обратно в строку JSON. Обратите внимание, что это дополнительный пример, и структура вашего JSON может отличаться. Вам нужно адаптировать код под вашу конкретную структуру данных JSON.

2.14 R

hide_sensitive_info <- function(data) {
  # Заменить чувствительную информацию в столбцах
  data$snils <- gsub("\\d{3}[ -.]?\\d{3}[ -.]?\\d{3}[ -.]?\\d{2}", "[скрытые данные]", data$snils, perl = TRUE)
  data$oms_number <- gsub("\\d{16}", "[скрытые данные]", data$oms_number, perl = TRUE)
  data$passport <- gsub("\\d{4} \\d{6}", "[скрытые данные]", data$passport, perl = TRUE)
  data$email <- gsub("\\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}\\b", "[скрытые данные]", data$email, perl = TRUE)
  data$phone <- gsub("\\+\\d{1,3}\\s?\\(\\?\\d{3}\\)?[-.\\s]?\\d{3}[-.\\s]?\\d{2}[-.\\s]?\\d{2}", "[скрытые данные]", data$phone, perl = TRUE)
  data$dms_number <- gsub("[A-Z]{2}\\d{9}", "[скрытые данные]", data$dms_number, perl = TRUE)
  data$military_id <- gsub("[A-Z]{2}\\d{7}", "[скрытые данные]", data$military_id, perl = TRUE)
  data$pension_id <- gsub("\\d{10}", "[скрытые данные]", data$pension_id, perl = TRUE)
  data$inn <- gsub("\\d{10}", "[скрытые данные]", data$inn, perl = TRUE)
  data$address <- gsub("\\d+\\s+[\\w\\s]+\\s+(?:St\\.?|Ave\\.?|Rd\\.?|Blvd\\.?|Ln\\.?)", "[скрытые данные]", data$address, perl = TRUE)

  return(data)
}

# Пример использования
original_data <- data.frame(
  snils = c("123-456-789-01", "987-654-321-09"),
  oms_number = c("1234567890123456", "9876543210987654"),
  passport = c("1234 567890", "5678 901234"),
  email = c("test1@example.com", "test2@example.com"),
  phone = c("+12345678901", "+98765432109"),
  dms_number = c("AB123456789", "CD987654321"),
  military_id = c("AB1234567", "CD9876543"),
  pension_id = c("1234567890", "0987654321"),
  inn = c("1234567890", "0987654321"),
  address = c("123 Main St", "456 Oak Ave")
)

processed_data <- hide_sensitive_info(original_data)
print(processed_data)

2.15 Rust

use regex::Regex;

fn hide_sensitive_info(text: &str) -> String {
    let mask = "[скрытые данные]";

    // Заменить чувствительную информацию
    let snils_pattern = Regex::new(r"\d{3}[ -.]?\d{3}[ -.]?\d{3}[ -.]?\d{2}").unwrap();
    let oms_pattern = Regex::new(r"\d{16}").unwrap();
    let passport_pattern = Regex::new(r"\d{4} \d{6}").unwrap();
    let email_pattern = Regex::new(r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b").unwrap();
    let phone_pattern = Regex::new(r"\+\d{1,3}\s?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{2}[-.\s]?\d{2}").unwrap();
    let dms_pattern = Regex::new(r"[A-Z]{2}\d{9}").unwrap();
    let military_id_pattern = Regex::new(r"[A-Z]{2}\d{7}").unwrap();
    let pension_id_pattern = Regex::new(r"\d{10}").unwrap();
    let inn_pattern = Regex::new(r"\d{10}").unwrap();
    let address_pattern = Regex::new(r"\d+\s+[\w\s]+\s+(?:St\.?|Ave\.?|Rd\.?|Blvd\.?|Ln\.?)").unwrap();

    let result = address_pattern.replace_all(
        &pension_id_pattern.replace_all(
            &military_id_pattern.replace_all(
                &dms_pattern.replace_all(
                    &phone_pattern.replace_all(
                        &email_pattern.replace_all(
                            &passport_pattern.replace_all(
                                &oms_pattern.replace_all(
                                    &snils_pattern.replace_all(text, mask),
                                    mask,
                                ),
                                mask,
                            ),
                            mask,
                        ),
                        mask,
                    ),
                    mask,
                ),
                mask,
            ),
            mask,
        ),
        mask,
    );

    result.to_string()
}

fn main() {
    // Пример использования
    let original_text = "СНИЛС 123-456-789-01, e-mail: test@example.com, телефон: +12345678901";
    let processed_text = hide_sensitive_info(original_text);
    println!("{}", processed_text);
}

Для работы с регулярными выражениями вам потребуется добавить зависимость на библиотеку regex в ваш Cargo.toml:

[dependencies]
regex = "1.5"

2.16 Ruby

def hide_sensitive_info(text)
  mask = "[скрытые данные]"

  # Заменить чувствительную информацию
  snils_pattern = /\d{3}[ -.]?\d{3}[ -.]?\d{3}[ -.]?\d{2}/
  oms_pattern = /\d{16}/
  passport_pattern = /\d{4} \d{6}/
  email_pattern = /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b/
  phone_pattern = /\+\d{1,3}\s?\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{2}[-.\s]?\d{2}/
  dms_pattern = /[A-Z]{2}\d{9}/
  military_id_pattern = /[A-Z]{2}\d{7}/
  pension_id_pattern = /\d{10}/
  inn_pattern = /\d{10}/
  address_pattern = /\d+\s+[\w\s]+\s+(?:St\.?|Ave\.?|Rd\.?|Blvd\.?|Ln\.?)/

  # Последовательно применить все регулярные выражения
  result = address_pattern.gsub(
    pension_id_pattern.gsub(
      military_id_pattern.gsub(
        dms_pattern.gsub(
          phone_pattern.gsub(
            email_pattern.gsub(
              passport_pattern.gsub(
                oms_pattern.gsub(
                  snils_pattern.gsub(text, mask),
                  mask
                ),
                mask
              ),
              mask
            ),
            mask
          ),
          mask
        ),
        mask
      ),
      mask
    ),
    mask
  )

  result
end

# Пример использования
original_text = "СНИЛС 123-456-789-01, e-mail: test@example.com, телефон: +12345678901"
processed_text = hide_sensitive_info(original_text)
puts processed_text

2.17 Ada

with Ada.Text_IO;

procedure Hide_Sensitive_Info is
   function Hide_Data (Input_String : String) return String is
      Sensitive_Pattern : String := "[скрытые данные]";
      Sensitive_Start   : Natural;
      Sensitive_End     : Natural;
   begin
      -- Поиск и замена СНИЛС
      Sensitive_Start := Input_String'First;
      loop
         Sensitive_Start := Input_String'First + Input_String'Length;
         exit when Input_String (Sensitive_Start .. Sensitive_Start + 2) = "123";

         -- Перейти к следующей подстроке
      end loop;

      Sensitive_End := Sensitive_Start + 2;
      return Input_String (Input_String'First .. Sensitive_Start - 1) &
             Sensitive_Pattern &
             Input_String (Sensitive_End + 1 .. Input_String'Last);
   end Hide_Data;

   Input_String : constant String := "СНИЛС 123-456-789-01, e-mail: test@example.com";
   Output_String : String (1 .. Input_String'Length + 50);  -- Увеличьте размер, если это необходимо
begin
   Output_String := Hide_Data (Input_String);
   Ada.Text_IO.Put_Line (Output_String);
end Hide_Sensitive_Info;

В этом примере используется простая проверка наличия подстроки "123". Вам может потребоваться настроить это в соответствии с реальными требованиями.

2.18 Lua

function hide_sensitive_info(text)
    local mask = "[скрытые данные]"

    -- Поиск и замена СНИЛС
    text = string.gsub(text, "%d%d%d[%s%.%-]?%d%d%d[%s%.%-]?%d%d%d[%s%.%-]?%d%d", mask)

    -- Поиск и замена номера полиса ОМС
    text = string.gsub(text, "%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d", mask)

    -- Поиск и замена паспорта
    text = string.gsub(text, "%d%d%d%d %d%d%d%d%d%d", mask)

    -- Поиск и замена e-mail
    text = string.gsub(text, "%b<>", mask)

    -- Поиск и замена телефона
    text = string.gsub(text, "%+%d+%s?%(%d+%)?[%-%.%s]?%d+[%-%.%s]?%d+[%-%.%s]?%d+", mask)

    -- Поиск и замена номера полиса ДМС
    text = string.gsub(text, "[A-Z][A-Z]%d%d%d%d%d%d%d%d%d", mask)

    -- Поиск и замена номера военного билета
    text = string.gsub(text, "[A-Z][A-Z]%d%d%d%d%d%d%d", mask)

    -- Поиск и замена номера пенсионного удостоверения
    text = string.gsub(text, "%d%d%d%d%d%d%d%d%d%d", mask)

    -- Поиск и замена ИНН
    text = string.gsub(text, "%d%d%d%d%d%d%d%d%d%d", mask)

    -- Поиск и замена адреса
    text = string.gsub(text, "%d+%s+[%w%s]+%s+(St%.?|Ave%.?|Rd%.?|Blvd%.?|Ln%.?)", mask)

    return text
end

-- Пример использования
original_text = "Ваши данные: СНИЛС 123-456-789-01, e-mail: test@example.com"
processed_text = hide_sensitive_info(original_text)
print(processed_text)

Пример может потребовать настройки в зависимости от конкретных требований вашего проекта.