Как преобразовать "строку" в "* s * t * r * i * n * g *" - PullRequest
4 голосов
/ 19 июля 2010

Мне нужно преобразовать строку как

"string"

до

"*s*t*r*i*n*g*"

Что такое шаблон регулярного выражения? Язык Java.

Ответы [ 4 ]

23 голосов
/ 19 июля 2010

Вы хотите сопоставить пустую строку и заменить на "*". Итак, что-то вроде этого работает:

System.out.println("string".replaceAll("", "*"));
// "*s*t*r*i*n*g*"

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

System.out.println("string".replace("", "*"));
// "*s*t*r*i*n*g*"

Почему это работает

Это потому, что любой экземпляр строки startsWith(""), endsWith("") и contains(""). Между любыми двумя символами в любой строке есть пустая строка. На самом деле в этих местах бесконечное количество пустых строк.

(И да, это верно для самой пустой строки. Это «пустая» строка contains сама!).

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


«Реальное» решение регулярных выражений

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

System.out.println("string".replaceAll(".?", "*$0"));
// "*s*t*r*i*n*g*"

Это работает путем сопоставления «любого» символа с . и замены его на * и этого символа путем обратной ссылки на группу 0.

Чтобы добавить звездочку для последнего символа, мы разрешаем . опционально сопоставляться с .?. Это работает, потому что ? является жадным и всегда будет принимать символ, если это возможно, т.е. где угодно, кроме последнего символа.

Если строка может содержать символы новой строки, используйте режим Pattern.DOTALL/(?s).

Ссылки

5 голосов
/ 19 июля 2010

Я думаю, "" - это регулярное выражение, которое вы хотите.

System.out.println("string".replaceAll("", "*"));

Это печатает *s*t*r*i*n*g*.

3 голосов
/ 19 июля 2010

Если это все, что вы делаете, я бы не использовал регулярное выражение:

public static String glitzItUp(String text) {
    return insertPeriodically(text, "*", 1);
}

Помещение char в строку java для каждого N символов

public static String insertPeriodically(
    String text, String insert, int period) 
{
    StringBuilder builder = new StringBuilder(
        text.length() + insert.length() * (text.length()/period)+1);

    int index = 0;
    while (index <= text.length())
    {
        builder.append(insert);
        builder.append(text.substring(index,
            Math.min(index + period, text.length())));
        index += period;
    }
    return builder.toString();
}

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

IDEOne |Рабочий пример

0 голосов
/ 19 июля 2010

Просто чтобы быть придурком, я собираюсь сказать, используйте J:

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

asterisked =: 3 : 0 
 i =. 0
 running_String =. '*'
 while. i < #y do. 
    NB. #y returns tally, or number of items in y: right operand to the verb
    running_String =. running_String, (i{y) , '*'
    i =. >: i
 end.
 ]running_String
)

Вот почему я бы использовал J: я знаю, как это сделать, и свободно изучал язык только пару месяцев. Это не так кратко, как весь метод .replaceAll (), но вы можете легко сделать это самостоятельно и позже отредактировать его под свои спецификации. Не стесняйтесь удалять это / тролль это / воспламеняться по моему предложению J, мне действительно все равно: я не рекламирую это.

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