Регулярное выражение для соответствия любому числу, если оно не является частью указанной c строки - PullRequest
2 голосов
/ 14 июля 2020

Извините, если это обман, я поискал, но не смог найти что-то, что соответствует моему запросу.

У меня есть функция замены в java, которая запускает несколько регулярных выражений для поиска и замены спецификаций c строк.

Один из них смотрит на числа, и если он находит число, он добавляет пробел вокруг него, например;

test123> test 123

используется регулярное выражение «(([0-9] +)», и оно заменяет его на «$ 1»

Я столкнулся с проблемой, хотя в некоторых крайних случаях мне нужно не разделять число из Speci c string, например, ha sh names. Итак, теперь мне нужно обновить мое регулярное выражение, чтобы обернуть любую комбинацию чисел пробелами, ЕСЛИ она не соответствует определенной последовательности c.

Например, , Мне нужны следующие результаты:

  • test123> test 123
  • 84test> 84 test
  • test md5> test md5
  • sha256> sha256
  • слово два sha1> слово два sha1
  • w0rd> w 0 rd
  • aisha256> aisha 256
  • word md 5> word md 5 et c

Я пробовал использовать отрицательный поиск назад, чтобы сопоставить такие слова, как md5, sha1, sha256, et c, но это до сих пор кажется, что цифры разделились. Я уверен, что это что-то простое. Я делаю не так .... "((?! Md5) (\ d +))"

Итак, основные c правила, любые di git найденные в строка должна быть окружена пробелами, ЕСЛИ ей не предшествует слово sha или md. Если между числом и md или sha уже есть пробел, он должен остаться. sha или md может быть началом строки ИЛИ ему может предшествовать пробел или символ. подчеркивание, но не может быть в конце более длинного слова или в середине слова.

Спасибо

Ответы [ 2 ]

4 голосов
/ 14 июля 2020

Похоже, что следующее регулярное выражение работает:

(?<=\d)(?=\D)|(?<=\D)(?<!sha|md|^)(?=\d)|_

Просто замените указанное выше одним пробелом.

Демо

Java код:

List<String> inputs = Arrays.asList("test123", "84test", "test_md5", "sha256",
                                    "word_two_sha1", "w0rd");
for (String input : inputs) {
    String output = input.replaceAll("(?<=\\d)(?=\\D)|(?<=\\D)(?<!sha|md|^)(?=\\d)|_", " ");
    System.out.println(input + " > " + output);
}

Это печатает:

test123 > test 123
84test > 84 test
test_md5 > test md5
sha256 > sha256
word_two_sha1 > word two sha1
w0rd > w 0 rd

Основная стратегия c регулярного выражения здесь состоит в разделении на границе между символом di git и non di git, если перед ним не должно быть sha или md.

2 голосов
/ 14 июля 2020

В качестве альтернативы вы также можете использовать

(?<!\d|^)(?<!(?<![^\W_])(?:sha|md))(?=\d)|(?<=\d)(?!\d|$)|_

Он будет соответствовать положению между di git и non di git или знаком подчеркивания.

In Если справа есть di git, то, что стоит перед di git, не может быть sha или md , которому не предшествует какой-либо символ, кроме слова char без символ подчеркивания.

Пояснение

  • (?<!\d|^) Если не оглядываться на di git или начало строки
  • (?<! Если не оглядываться на
    • (?<![^\W_]) Если не оглядываться на слово char, кроме символа подчеркивания
    • (?:sha|md) Match sha или md с последующим необязательным di git
  • ) Закрыть просмотр назад
  • (?=\d) Утвердить di git прямо вправо
  • | Или
  • (?<=\d)(?!\d|$) Если оглядываться на di git и не ждать пробельного символа или конца строки
  • | Или
  • _ Соответствует символу подчеркивания

Демонстрация Regex | Java демонстрация

Пример

String strings[] = {"Aisha256", "ai_sha256", "test123", "84test", "test md5", "sha256", "word two sha1", "w0rd", "test_md5", "sha256", "md5"};
for (String str : strings){
    System.out.println(str.replaceAll("(?<!\\d|^)(?<!(?<![^\\W_])(?:sha|md))(?=\\d)|(?<=\\d)(?!\\d|$)|_", " "));
}

Вывод

Aisha 256
ai sha256
test 123
84 test
test md5
sha256
word two sha1
w 0 rd
test md5
sha256
md5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...