Каково влияние "*" в регулярных выражениях? - PullRequest
8 голосов
/ 03 февраля 2009

Мой исходный код Java:

String result = "B123".replaceAll("B*","e");
System.out.println(result);

Вывод: ee1e2e3e. Почему?

Ответы [ 3 ]

21 голосов
/ 03 февраля 2009

'*' означает ноль или более совпадений предыдущего символа. Таким образом, каждая пустая строка будет заменена на «е».

Возможно, вы вместо этого хотите использовать '+':

replaceAll("B+", "e")

7 голосов
/ 03 февраля 2009

Вы хотите это для вашего шаблона:

B+

И ваш код будет:

String result = "B123".replaceAll("B+","e");
System.out.println(result);

«*» соответствует «нулю или более», а «ноль» включает в себя все, что находится перед буквой B, а также между всеми остальными символами.

1 голос
/ 03 февраля 2009

Я потратил более месяца, работая в крупной технологической компании, исправляя ошибку с * (splat!) В регулярных выражениях. Мы поддерживали малоизвестную ОС UNIX. Моя голова чуть не взорвалась, потому что это соответствует НУЛЯМ в случае столкновения с персонажем. Разговор о трудной ошибке, чтобы понять через свои собственные воссоздания. Мы были двойными заменами в некоторых случаях. Я не мог понять, почему код был неправильным, но смог добавить код, который обнаружил особый (неправильный) случай и предотвратил двойную подпрограмму и не сломал ни одну из утилит, которые его включали (включая sed и awk). Я был горд, что исправил эту ошибку, но, как уже упоминалось.

Ради бога, просто используйте + !!!!

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