Удалить пробелы и специальные символы (только между числами) в строке - PullRequest
0 голосов
/ 16 апреля 2020

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

String s1 = "This is Sample AmericanExp Card Number 3400 1000 2000 009";

Я пытаюсь: -

String s1 = "This is Sample AmericanExp Card Number 3400 1000 2000 009";
String regExp = "[^\\w]+";
String replacement = "";
String changed= s1.replaceAll(regExp, replacement);
System..out.println("changed->"+content);

Его выдача выводится как ThisisSampleAmericanExpCardNumber340000000000009 , Требуется вывод «Это Образец карты AmericanExp № 340010002000009 ". Оцените Справку и, пожалуйста, дайте мне знать концепцию, стоящую за ней.

РЕДАКТИРОВАТЬ: - Теперь я маскирую номер карты и ее PIN-код (PCI), поэтому у меня есть эта формула

^((4\\d{3})|(5[1-5]\\d{2})|(6011))-?\\d{4}-?\\d{4}-?\\d{4}|3[4,7]\\d{13}$

Какие проверки для некоторых типов кредитных карт. Я изменяю его, чтобы проверить также его PIN-код и CVV (также соответствуют номерам 4 и 6 di git) Sample String = "Образец номера карты AmericanExp 3400 1000 2000 009 и PIN-код 1234, CVV = 654321"

Я изменил формулу следующим образом:

^((4\\d{3})|(5[1-5]\\d{2})|(6011))-?\\d{4}-?\\d{4}-?\\d{4}|3[47]\\d{13}$|^[0-9]{4}$|^[0-9]{6}$

Что не дает мне правильного вывода (также соответствует 4 и 6 числам di git).

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Вы можете использовать

.replaceAll("(?<=\\d)[\\W_]+(?=\\d)", "")

Или, если вам нужно иметь дело со строками Unicode:

.replaceAll("(?U)(?<=[0-9])[\\W_]+(?=[0-9])", "")

См. регулярное выражение . Подробности:

  • (?<=\d) - положительный вид сзади, который соответствует позиции, непосредственно предшествующей ди git
  • [\W_]+ - один или несколько несловесных или подчеркивающих символов
  • (?=\d) - положительный прогноз, соответствующий местоположению, за которым сразу следует ди git.

Обратите внимание, что встроенная опция (?U), Pattern.UNICODE_CHARACTER_CLASS сделает \W Unicode знает и больше не будет соответствовать кириллице c, et c. буквы.

См. Java демо :

String s1 = "This is Sample AmericanExp Card Number 3400 1000 2000 009";
System.out.println("changed -> " + s1.replaceAll("(?<=\\d)[\\W_]+(?=\\d)", ""));
// => changed -> This is Sample AmericanExp Card Number 340010002000009
0 голосов
/ 16 апреля 2020

Попробуйте это регулярное выражение: (?<=[0-9]+)\s(?=[0-9]+). Он использует положительный взгляд вперед и взгляд назад, поэтому он сопоставляет числа без фактического их захвата и замены (хотя предполагается, что у вас есть только цифры, состоящие из цифр и один пробел, разделяющий их).

Когда вы ставите (?<=foo)bar , это означает, что 'foo' должно предшествовать 'bar', но регулярное выражение на самом деле не захватывает 'foo'. С bar(?=foo) это то же самое, но «foo» следует после «bar». Поэтому, когда вы вызываете метод replace, заменяется только пробел, а не числа.

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

РЕДАКТИРОВАТЬ: Если вы также хотите извлечь PIN-код из строки, вы можете сделать то же самое с (?<=PIN= )\d* или (?<=PIN\sis\s)\d*, в зависимости от того, что ваш Синтаксис есть. Это соответствует пачке цифр (\ d *), перед которыми стоит текст «PIN is» или что вы добавили после «? <=» </p>

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