Как добавить пробел после определенных символов, используя регулярное выражение Java - PullRequest
1 голос
/ 14 апреля 2020

У меня есть строка, состоящая из 18 цифр. Например. 'Abcdefghijklmnopqr. Мне нужно добавить пробел после 5-го символа, а затем после 9-го символа и после 15-го символа, чтобы он выглядел как 'abcde fghi jklmno pqr'. Могу ли я добиться этого с помощью регулярных выражений?

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

Заранее спасибо

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

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

final Pattern pattern = Pattern.compile("([a-z]{5})([a-z]{4})([a-z]{6})([a-z]{3})");
final Matcher matcher = pattern.matcher("abcdefghijklmnopqr");
if (matcher.matches()) {
    String first = matcher.group(0);
    String second = matcher.group(1);
    String third = matcher.group(2);
    String fourth = matcher.group(3);
    return first + " " + second + " " + third + " " + fourth;
} else {
    throw new SomeException();
}

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

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

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

Вы также можете сделать более простая версия, в которой вы просто заменяете на:

"abcdefghijklmnopqr".replaceAll("([a-z]{5})([a-z]{4})([a-z]{6})([a-z]{3})", "$1 $2 $3 $4")

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

Вот пример решения с использованием подстрок, который был бы более эффективным, если вам не нужна проверка:

final Set<Integer> breaks = Set.of(5, 9, 15);
final String str = "abcdefghijklmnopqr";
final StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
    if (breaks.contains(i)) {
        stringBuilder.append(' ');
    }
    stringBuilder.append(str.charAt(i));
}
return stringBuilder.toString();     
0 голосов
/ 14 апреля 2020

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

Поскольку вы не ищете шаблон в своей строке, а просто n-й символ, регулярное выражение не будет иметь большого значения, оно сделает его ненужным сложным.

Вот несколько идей о том, как можно реализовать решение:

  1. Использовать массив символов, чтобы избежать создания избыточных строк : создать массив символов и скопировать символы из строки перед заданной позицией, поместите символ в позицию, скопируйте оставшиеся символы из строки, ... продолжайте, пока не достигнете конца строки. После этого создайте последнюю строку из этого массива.
  2. Используйте метод Substring () : объединить подстроку строки перед позицией, новый символ, подстроку строки после позиции и перед следующая позиция, ... и так далее, до достижения конца исходной строки.
  3. Используйте метод StringBuilder и метод его вставки () .

Обратите внимание:

  • Первая идея перечисленное не может быть подходящим решением для очень больших строк. Требуется вспомогательный массив, использующий дополнительное пространство.
  • Вторая идея создает избыточные строки. Строки являются неизменяемыми и окончательными в Java и хранятся в пуле. Следует избегать создания временных строк.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...