正则表达式生成一个连续字母的单词

时间:2017-02-16 08:55:07

标签: java regex

我正在尝试创建一个正则表达式,它从我感兴趣的输入中为我提供了几个组合对。

如果我有以下输入......

“pppeeeople”

我想创建以下排列......

人民,人民,人民,人民。

我现在可以使用以下两个REGEX来创建'people'和'ppeeople',输入的单词是'pppeeeople'。

String temp = word.replaceAll("(.)\\1{2,}", "$1$1");  //result ppeeople
String temp2 = word.replaceAll("(.)\\1{1,}", "$1");   //result people

但是我希望能够生成一个REGEX,它也可以用一组两个连续的字母来抓住这个单词,例如'ppeople',然后是另一个可以跳过第一个输入的双字符序列并产生'peeople'的REGEX '等等。基本思想是获得包含两个连续字符的单词的所有排列。

使用REGEX是可能的,还是我应该在列表中使用循环和StringBuilder?

这很接近,但它会产生超出范围的索引错误,我仍然需要从ArrayList重复中删除重复项,我将其添加到。

int index = temp.length();

        for (int i = 0; i < index; i++) {
            System.out.println("Index" + i + ": " + temp);
            if(temp.charAt(i) == temp.charAt(i+1)) {
                StringBuilder sb = new StringBuilder(temp);
                repeats.add(temp);
                sb.deleteCharAt(i);
                temp = sb.toString();
            }
        }

2 个答案:

答案 0 :(得分:0)

很抱歉,没有一个正则表达式会返回所有置换字符串。相反,我更喜欢使用递归方法,它将返回列表中的所有字符串。

如果您想这样做,请参阅answers here

在C ++中,stl算法中有一个名为next_permutation()的函数,它返回给定字符串中的下一个置换字符串。

更新

根据问题的编辑,这里有一个片段来获取给定字符串的组合 -

public class Combination {

    //Use Set/HashSet instead of ArrayList if you do not want duplicate string
    //Set<String> combinations = new HashSet<String>();
    private ArrayList<String> combinations = new ArrayList<>();

    public void generate(String instr) {
        generate(instr, new StringBuffer(), 0);
    }
    private void generate(String instr, StringBuffer outstr, int index) {
        for (int i = index; i < instr.length(); i++) {
            outstr.append(instr.charAt(i));

            // Here you may add your rules to avoid all combinations
            combinations.add(outstr.toString());

            generate(instr, outstr, i + 1);
            outstr.deleteCharAt(outstr.length() - 1);
        }
    }

    public ArrayList<String> getCombinations() {
        return combinations;
    }
}

此处combinations数组列表将包含所需的所有组合。你可以这样称呼它 -

Combination cmb = new Combination();

cmb.generate("pppeeeople");

ArrayList<String> list = cmb.getCombinations();

for(String str : list){
    System.out.println(str);
}

现在,如果您想要几个组合而不是全部,您应该根据长度,角色,重复等添加自己的规则。

答案 1 :(得分:0)

不漂亮,但它确实产生了所需的输出。

    int index = temp.length();

    for (int i = 0; i < index; i++) {
      //  System.out.println("Index" + i + ": " + temp);
        try{
            if(temp.charAt(i) == temp.charAt(i+1)) {
                StringBuilder sb = new StringBuilder(temp);
                repeats.add(temp);
                sb.deleteCharAt(i);
            //    System.out.println("Sb after delete: " + sb.toString());
                temp = sb.toString();
            //    System.out.println("New Temp: " + temp);
            }
        } catch (Exception e) {
            //print.stackTrace(e);
        }
    }