Единое регулярное выражение для перехвата нескольких параметров и замены их соответствующими заменами - PullRequest
0 голосов
/ 16 июня 2020

Проблема выглядит так:

совпадение значений: 218 \ d {3} (\ d {4}) @ domain.com замените на 10 \ 1, чтобы получить 10, за которыми следуют последние 4 цифры, например 2181234567 станет 104567

совпадение значений: 332 \ d {3} (\ d {4}) @ domain.com замените на 11 \ 1, чтобы получить 11, за которыми следуют последние 4 цифры, например, 3321234567 станет 114567

соответствие значения: 420 \ d {3} (\ d {4}) @ domain.com замените на 12 \ 1, чтобы получить 12, за которыми следуют последние 4 цифры .. и так далее, например, 4201234567 станет 124567

Есть ли лучший способ поймать разные значения и заменить их соответствующими заменами в одном RegEx, чем создание нескольких выражений?

Like (218 | 332 | 420) \ d {3} (\ d {4}) @ domain.com, чтобы заменить 10 \ 4 | 11 \ 4 | 12 \ 4) и получить только соответствующие результаты при сопоставлении.

Изменить: не указывать вариант использования: это для моя АТС, которая просто использует RegEx для сопоставления шаблонов, а затем заменяет его значениями, которые я хочу, чтобы go выводился. Нет кода. Просто введите RegEx в GUI. Также для личного использования, если я смогу заставить его работать с Notepad ++

Ответы [ 3 ]

1 голос
/ 18 июня 2020
  • Ctrl + H
  • Найти что: (?:(218)|(332)|(420))\d{3}(\d{4})(?=@domain\.com)
  • Заменить на: (?{1}10$4)(?{2}11$4)(?{3}12$4)
  • ПРОВЕРИТЬ Обернуть
  • ПРОВЕРИТЬ Регулярное выражение
  • Заменить все

Пояснение:

(?:                 # non capture group
    (218)               # group 1, 218
  |                 # OR
    (332)               # group 2, 332
  |                 # OR
    (420)               # group 3, 420
)                   # end group
\d{3}               # 3 digits
(\d{4})             # group 4, 4 digits
(?=@domain\.com)    # positive lookahead, make sure we have "@domain.com" after
                    # that allows to keep "@domain.com"
                    # if you want to remove it from the result, just put "@domain\.com"
                    # without lookahead.

Замена:

(?{1}               # if group 1 exists
    10                  # insert "10"
    $4                  # insert content of group 4
)                   # endif
(?{2}11$4)          # same as above
(?{3}12$4)          # same as above

Снимок экрана (ранее ):

enter image description here

Снимок экрана (после):

enter image description here

0 голосов
/ 31 августа 2020

@ Toto имеет хороший ответ, и есть еще один метод, если оператор (?{1}...) недоступен (но спасибо, Toto, я не знал об этой функции NotePad ++). Подробнее о моем ответе здесь: { ссылка }

Добавить в конец do c:

,218=>10,332=>11,420=>12

Искать:

(218|332|420)\d{3}(\d{4})(?=@domain.com)(?=[\s\S]*,\1=>([^,]*))

Заменить на

\3\2

часы в действии: Множественные замены в Notepad ++

0 голосов
/ 17 июня 2020

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

Вы не указали используемый язык, регулярные выражения зависят от языка . Вот фрагмент кода JavaScript, в котором используется функция поиска:

var str1 = '2181234567@domain.com';
var str2 = '3321234567@domain.com';
var str3 = '4201234567@domain.com';
var strMap = {
  '218': '10',
  '332': '11',
  '420': '12'
  // add more as needed
};
function fixName(str) {
  var re = /(\d{3})\d{3}(\d{4})(?=\@domain\.com)/;
  var result = str.replace(re, function(m, p1, p2) {
    return strMap[p1] + p2;
  });
  return result;
}
var result1 = fixName(str1);
var result2 = fixName(str2);
var result3 = fixName(str3);
console.log('str1: ' + str1 + ', result1: ' + result1);
console.log('str2: ' + str2 + ', result2: ' + result2);
console.log('str3: ' + str3 + ', result3: ' + result3);

Вывод:

str1: 2181234567@domain.com, result1: 104567@domain.com
str2: 3321234567@domain.com, result2: 114567@domain.com
str3: 4201234567@domain.com, result3: 124567@domain.com
...