Я написал следующую строку кода:
str.replaceAll("xxx(ayyy)xxx", "$1".substring(0,1).equals("a") ? "a" : "b");
Но я обнаружил, что "$ 1" .substring (0,1) будет выводить "$" вместо "a". Есть ли способ решить эту проблему?
Второй параметр replaceAll является обычной строкой.
replaceAll
Java будет оценивать ваш параметр перед передачей его в функцию, а не для каждого совпадения. "$1".substring(0,1) просто возвращает первый символ в строке $1.
"$1".substring(0,1)
$1
Вам необходимо вызвать метод appendReplacement класса Matcher в цикле.
appendReplacement
Matcher
Если вы хотите применить различные замены для каждого матча, используйте appendReplacement / appendTail:
appendTail
Pattern p = Pattern.compile("xxx(ayyy)xxx"); StringBuffer out = new StringBuffer(); Matcher m = p.matcher("..."); while (m.find()) { m.appendReplacement(out, m.group(1).substring(0, 1).equals("a") ? "a" : "b"); } m.appendTail(out);
(начало, конец) даст вам подстроку от начала до конца до конца. Если вы хотите удалить первый элемент, попробуйте substring (1, lengthOfString)