Извлечь подстроку из значения пары ключ-значение, используя регулярное выражение - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть строка в журнале, и я хочу замаскировать значения на основе регулярного выражения.

Например :

"email":"testEmail@test.com", "phone":"1111111111", "text":"sample text may contain email testEmail@test.com as well"

Регулярное выражение должно маскировать

  1. значение электронной почты - оба в строке после «email» и «текст»
  2. номер телефона

Желаемый вывод :

"email":"*****", "phone":"*****", "text":"sample text may contain email ***** as well"

Я смог маскировать электронную почту и телефон по отдельности, но не идентификатор электронной почты, присутствующий в строке после слова «текст».

Regex разработано до сих пор :

(?<=\"(?:email|phone)\"[:])(\")([^\"]*)(\")

https://regex101.com/r/UvDIjI/2/

Ответы [ 3 ]

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

Граница слова метапоследовательности \b & Чередование |

Шаблон входной строки содержит либо кавычки, либо пробелы, обернутые вокруг целей, которые рассматриваются какне-слова.Итак, это: «\b emailPattern \b» и это: пробел \b emailPattern \b пробел - совпадения,Чередование дает одной линии мощность двух линий.Искать emailPattern ИЛИ phonePattern .

/(\b\w+?@\w+?\.\w+?\b|[0-9]{10})/g;
  • ( Граница слова (не слово слева) \b
  • Один или несколько символов слова \w+?
  • Литерал @
  • Один или несколько символов слова \w+?
  • Экранированный литерал .
  • Один или несколько символов слова \w+?
  • Граница слова (не слово справа) \b
  • ИЛИ |
  • 10 последовательных чисел [0-9]{10} )
  • g Флаг lobal продолжает поиск после первого совпадения.

Демо

let str = `"email":"testEmail@test.com", "phone":"1111111111", "text":"sample text may contain email testEmail@test.com as well"`;

const rgx = /(\b\w+?@\w+?\.\w+?\b|[0-9]{10})/g;

let res = str.replace(rgx, '*****');

console.log(res);
0 голосов
/ 06 февраля 2019

Ваш текущий RegEx пытается сделать слишком много за один дубль.Вам лучше разделить условия и разобраться с ними по отдельности.Я предполагаю, что ввод всегда будет соответствовать структуре вашего примера, без крайних случаев:

  1. Электронные письма:
    • \w+@.+?(?="|\s) - В электронных письмах каждому символу предшествует @ всегда является символом слова, поэтому для ввода первой половины письма достаточно набрать \w+@.Что касается второй половины, я использовал подстановочный знак (.) с ленивым квантификатором (+?), чтобы остановить захват как можно скорее, и объединил его с положительным прогнозом, который проверяет двойные кавычки или пробелы ((?="|\s)) так, чтобы захватить оба письма в свойствах "email" и "text". Lookarounds - это утверждения нулевой длины , и поэтому они не фиксируются.
  2. Номер телефона:
    • (?<="phone":")\d+ - Здесь я просто используюпрефикс "phone":" в виде сзади и затем захватывает только цифры \d+.

Объедините оба условия, и вы получите свой RegEx: \w+@.+?(?="|\s)|(?<="phone":")\d+.

Regex101: https://regex101.com/r/UvDIjI/3

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

Поскольку вы не соответствуете адресу электронной почты в первой части, сопоставляя не двойную кавычку, вы можете сопоставить адрес электронной почты в тексте, также не сопоставляя двойную кавычку.

Один из способов сделать этоможет быть, чтобы получить совпадения, используя lookarounds и чередование .Затем замените совпадения на *****

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

(?<="(?:phone|email)":")[^"]+(?=")|[^@"\s]+@[^@"\s]+

Объяснение

  • (?<="(?:phone|email)":") Подтвердите, что слева есть либо "телефон": ", либо" электронная почта ":"
  • [^"]+(?=") Не сопоставляйте двойную кавычку и убедитесь, что она естьв конце
  • | или
  • [^@"\s]+@[^@"\s]+ Совпадение с шаблоном email like с использованием отрицательного класса символов, не являющегося двойной кавычкой или @

См. regex demo

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