Заменить все нечетные вхождения подстроки, используя регулярное выражение - PullRequest
0 голосов
/ 30 мая 2018

У меня есть строка ~~40~~ Celsius Temp: 33 Celsius Temp:~~50~~

Я хочу заменить нечетные вхождения подстроки '~~', т. Е. 1-го, 3-го .. другой строкой '**'.

Мой вывод должен быть **40~~ Celsius Temp: 33 Celsius Temp:**50~~

Как этого добиться с помощью регулярных выражений в Java?

Ответы [ 4 ]

0 голосов
/ 30 мая 2018

Ну, некоторые уже предложили подобное решение, но все же:

String org = "~~40~~ Celsius Temp: 33 Celsius Temp:~~50~~";
String rep = org.replaceAll("~~(\\d)","**$1");

Здесь ~~(\d) будет искать ~~ с последующей цифрой и заменять на **, чтобы сохранить первую цифру, используя$1

0 голосов
/ 30 мая 2018

Вам действительно нужен элементарный парсер, чтобы справиться с этим;регулярное выражение не было предназначено для подсчета таких случаев.Логика кода ниже проста.Каждый раз, когда мы попадаем в матч ~~, мы делаем одну из двух вещей.Если это нечетное вхождение, тогда мы добавляем пустую строку к замене, в противном случае мы повторно добавляем ~~, который мы сопоставили.

String input = "~~40~~ Celsius Temp: 33 Celsius Temp:~~50~~";
Pattern p = Pattern.compile("~~");
Matcher m = p.matcher(input);
StringBuffer sb = new StringBuffer(input.length());
int i = 0;

while (m.find()) {
    if (i % 2 == 0) {
        m.appendReplacement(sb, "**");
    }
    else {
        m.appendReplacement(sb, m.group(0));
    }
    ++i;
}
m.appendTail(sb);
System.out.println(sb.toString());

**40~~ Celsius Temp: 33 Celsius Temp:**50~~

Демо

0 голосов
/ 30 мая 2018

Вы можете использовать замену группы захвата, если ~~ идут строго парами.

private final static Pattern pattern = Pattern.compile("(?:~~([^~]+~~))");

public static String replaceOddTildes(String value) {
    return pattern.matcher(test).replaceAll("**$1");
}

И:

String result = replaceOddTildes("~~40~~ Celsius Temp: 33 Celsius Temp:~~50~~"));

Обратите внимание, что будет пропущено последнее нечетное числонабор тильд, если они не находятся в совпадающих парах:

replaceOddTildes("An ~~un~~ paired ~~example!").equals("An **un~~ paired ~~example!")`

Если вы хотите обрабатывать несопоставленную пару, конечно, тогда все в порядке.

Подробно по шаблону:

(?:             a non-capturing group, consisting of
    ~~          a pair of tildes, followed by
    (           a capturing group, consisting of
    [^~]+       one or more characters that is not a tilde, followed by
    ~~          a pair of tildes
    )           end of the capturing group
)               end of the non-capturing group

Замена для совпадения - пара звездочек, за которой следует содержимое группы захвата.

0 голосов
/ 30 мая 2018

Я думаю, что для постановки задачи вам не нужно искать странные вхождения, исходя из показанного в ней примера, вам нужно заменить ~~ (цифра) на ** (цифра) и игнорировать другие форматы ~~ ..

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