Пустые строки внутри непустой строки
Я запутался с кодом
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 [] при первом инициализации?
Извините, если я ошибаюсь в любой части моего вопроса.
Ответы
Ответ 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
Регулярное выражение, такое как "", будет соответствовать любой возможной пустой строке в строке. В этом случае это каждое пустое пространство в начале и в конце и после каждого символа в строке.