Заменить подстроку с помощью регулярного выражения - PullRequest
1 голос
/ 11 сентября 2010

Так как я не очень знаком с Java, я не знаю, есть ли где-нибудь библиотека, которая может сделать это.Если нет, у кого-нибудь есть идеи, как этого достичь?

Например, у меня есть строка "foo", и я хочу изменить букву f на "f" и "a", чтобы функция возвращаласписок строк со значениями "foo" и "aoo".

Как с этим справиться, когда больше одинаковых букв?"ffoo" в "ffoo", "afoo", "faoo", "aaoo".

Лучшее объяснение: (("a", ("a", "b)), (" c ", ("c", "d"))) Выше приведена группа символов, которые должны быть заменены символом из другого элемента. "a" должен быть заменен на "a" и на "b". "c"должен быть заменен на" c "и" d ".

Если у меня есть строка" ac ", мне нужно получить следующие комбинации:" ac "" bc "" ad "" bd "

Если строка «IaJaKc», получаются следующие комбинации: «IaJaKc», «IbJaKc», «IaJbKc», «IbJbKc», «IaJaKd», «IbJaKd», «IaJbKd», «IbJbKd»,

.комбинации могут быть рассчитаны следующим образом: (replacements_of_a ^ letter_amount_a) * (replacements_of_c ^ letter_amount_c) первый случай: 2 ^ 1 * 2 ^ 1 = 4 второй случай: 2 ^ 2 * 2 ^ 1 = 8

Если,скажем, группа (("a", ("a", "b)), (" c ", (" c "," d "," e "))), а строка" aac ",количество комбинаций: 2 ^ 2 * 3 ^ 1 = 12

Ответы [ 3 ]

1 голос
/ 11 сентября 2010

Вот код для вашего примера с foo и aoo

public List<String> doSmthTricky (String str) {
    return Arrays.asList("foo".replaceAll("(^.)(.*)", "$1$2 a$2").split(" "));
}

Для ввода "foo" этот метод возвращает список с 2 строками "foo" и "aoo".

Работает только в том случае, если во входной строке нет пробелов («foo» в вашем примере). В противном случае это немного сложнее.

Как бороться с этим, когда есть больше одинаковых букв? "ffoo" в "ffoo", "afoo", "faoo", "aaoo".

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

UPD : я создал рекурсивную функцию (на самом деле это полурекурсивная полу-итерация), которая генерирует строки на основе строки шаблона, заменяя свои первые символы на символы из указанного набора:

public static List<String> generatePermutations (String template, String chars, int depth, List<String> result) {
    if (depth <= 0) {
        result.add (template);
        return result;
    }
    for (int i = 0; i < chars.length(); i++) {
        String newTemplate = template.substring(0, depth - 1) + chars.charAt(i) + template.substring(depth);
        generatePermutations(newTemplate, chars, depth - 1, result);
    }
    generatePermutations(template, chars, depth - 1, result);
    return result;
}

Параметр @depth означает, сколько символов в начале строки следует заменить. Количество перестановок (chars.size() + 1) ^ depth.

Тесты:

System.out.println(generatePermutations("ffoo", "a", 2, new LinkedList<String>()));

Output: [aaoo, faoo, afoo, ffoo]

--
System.out.println(generatePermutations("ffoo", "ab", 3, new LinkedList<String>()));

Output: [aaao, baao, faao, abao, bbao, fbao, afao, bfao, ffao, aabo, babo, fabo, abbo, bbbo, fbbo, afbo, bfbo, ffbo, aaoo, baoo, faoo, aboo, bboo, fboo, afoo, bfoo, ffoo]
0 голосов
/ 12 сентября 2010

Вот оно:

public static void returnVariants(String input){
        List<String> output = new ArrayList<String>();
        StringBuffer word = new StringBuffer(input);
        output.add(input);

        String letters = "ac";
        int lettersLength = letters.length();
        int wordLength = word.length();
        String replacement = "";

        for (int i = 0; i < lettersLength; i++) {
            for (int j = 0; j < wordLength; j++) {
                if(word.charAt(j)==letters.charAt(i)){
                    if (word.charAt(j)=='a'){
                        replacement = "ab";
                    }else if (word.charAt(j)=='c'){
                        replacement = "cd";
                    }
                    List<String> tempList = new ArrayList<String>();
                    for (int k = 0; k < replacement.length(); k++) {
                        for (String variant : output){
                            StringBuffer tempBuffer = new StringBuffer(variant);
                            String combination = tempBuffer.replace(j, j+1, replacement.substring(k, k+1)).toString();
                            tempList.add(combination);
                        }
                    }
                    output.addAll(tempList);
                    if (j==0){
                        output.remove(0);
                    }
                }
            }
        }
        Set<String> uniqueCombinations = new HashSet(output);
        System.out.println(uniqueCombinations);
    }

Если для ввода задано «ac», возвращаются комбинации «ac», «bc», «ad», «bd». Если это может быть оптимизировано в дальнейшем, любая дополнительная помощь приветствуется и приветствуется.

0 голосов
/ 11 сентября 2010

Я не уверен, что тебе нужно. Пожалуйста, укажите источник и ожидаемый результат. В любом случае, вы должны использовать стандартные классы Java для этой цели: java.util.regex.Pattern, java.util.regex.Matcher. Если вам нужно иметь дело с повторяющимися буквами в начале, то есть два способа, использовать символ «^» - это означает начало строки, или для той же цели вы можете использовать ярлык «\ w», что означает начало слово. В более сложных случаях, пожалуйста, взгляните на выражения "lookbehind". Существует более чем полное описание этих методов, которые вы можете найти в java doc для java.util.regex, и если этого недостаточно, посмотрите на www.regular-expressions.info удачи.

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