Подтвердить что ты не робот

Пустые строки внутри непустой строки

Я запутался с кодом

public class StringReplaceWithEmptyString 
{
    public static void main(String[] args) 
    {
        String s1 = "asdfgh";
        System.out.println(s1);
        s1 = s1.replace("", "1");
        System.out.println(s1); 
    }
}

И результат:

asdfgh
1a1s1d1f1g1h1

Итак, мое первое мнение заключалось в том, что каждый символ в String имеет пустую строку "" с обеих сторон. Но если в этом случае после 'a' (в строке) должно быть два '1', входящих во вторую строку вывода (один для конца 'a' и второй для начала 's').

Теперь я проверил, представлен ли String как char [] в этих ссылках В Java, является String массив символов? и Строковое представление в Java. Я получил ответ как ДА.

Итак, я попытался присвоить пустой символ '' переменной char, но он дал мне ошибку компилятора,

Неверная константа символа

Тот же процесс дает ошибку компилятора, когда я пытался в char[]

char[] c = {'','a','','s'};  // CTE

Итак, я смущен тремя вещами.

  • Как пустая строка представлена ​​ char []?
  • Почему я получаю этот вывод для вышеуказанного кода?
  • Как строка s1 представлена ​​в char [] при первом инициализации?

Извините, если я ошибаюсь в любой части моего вопроса.

4b9b3361

Ответ 1

Идя с замечательным комментарием Энди Тернера, ваш вызов String#replace() фактически реализуется с помощью String#replaceAll(). Таким образом, здесь есть замена регулярного выражения. Матчи встречаются перед первым символом, между каждым символом в строке и после последнего символа.

^|a|s|d|f|g|h|$
 ^ this and every pipe matches to empty string ""

Соответствие, которое вы делаете, соответствует нулевой длине. В реализации Java regex, используемой в String.replaceAll(), это ведет себя как пример выше, а именно соответствие каждой межсимвольной позиции и позиций перед первым и после последних символов.

Вот ссылка, которая более подробно обсуждает совпадения с нулевой длиной: http://www.regexguru.com/2008/04/watch-out-for-zero-length-matches/

Совпадение с нулевой или нулевой длиной соответствует регулярному выражению, которое не соответствует никаким символам. Он соответствует только позиции в строке. Например. регулярное выражение \b совпадает между 1 и, в 1,2.

Ответ 2

Просто добавив еще немного объяснений в ответ Тима Бигелейзена.

Начиная с Java 8, код метода replace в классе java.lang.String

public String replace(CharSequence target, CharSequence replacement) {
        return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
                this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
}

Здесь вы можете четко видеть, что строка заменяется шаблоном Regex Pattern, а в regex "" идентифицируется символом нулевой длины и присутствует вокруг любого символа длины без нуля.

Итак, за сценой ваш код выполняется следующим образом

Pattern.compile("".toString(), Pattern.LITERAL).matcher("asdfgh").replaceAll(Matcher.quoteReplacement("1".toString()));

Выход будет

1a1s1d1f1g1h1

Ответ 3

Это связано с тем, что он выполняет регулярное совпадение шаблона/замены, которое вы передаете в replace().

 public String replace(CharSequence target, CharSequence replacement) {
    return Pattern.compile(target.toString(), Pattern.LITERAL).matcher(
     this).replaceAll(Matcher.quoteReplacement(replacement.toString()));
 }

Заменяет каждую подстроку этой строки, которая соответствует литеральной цели последовательность с указанной последовательностью замены литерала. замена начинается с начала строки до конца, для Например, замена "aa" на "b" в строке "aaa" приведет к "ba", а не "ab".

Параметры:

target Последовательность значений charдля замены

замена Последовательность замены значений char

Возвраты: результирующая строка

Throws: NullPointerException, если целевой или замена равна нулю.

С: 1.5

Подробнее читайте ниже по ссылке... (Также просмотрите исходный код).

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/String.java#String.replace%28java.lang.CharSequence%2Cjava.lang.CharSequence%29

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