Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Regex生成具有连续字母的单词_Java_Regex - Fatal编程技术网

Java Regex生成具有连续字母的单词

Java Regex生成具有连续字母的单词,java,regex,Java,Regex,我试图创建一个正则表达式,从我感兴趣的输入中提供一些组合对 如果我有以下输入 “人民” 我想创建以下排列 人,人,人,人,人 我目前可以使用以下两个正则表达式创建“people”和“ppeeople”,其中输入单词是“pppeeople” String temp = word.replaceAll("(.)\\1{2,}", "$1$1"); //result ppeeople String temp2 = word.replaceAll("(.)\\1{1,}", "$1"); //re

我试图创建一个正则表达式,从我感兴趣的输入中提供一些组合对

如果我有以下输入

“人民”

我想创建以下排列

人,人,人,人,人

我目前可以使用以下两个正则表达式创建“people”和“ppeeople”,其中输入单词是“pppeeople”

String temp = word.replaceAll("(.)\\1{2,}", "$1$1");  //result ppeeople
String temp2 = word.replaceAll("(.)\\1{1,}", "$1");   //result people
然而,我希望能够生成一个正则表达式,它还可以用一组两个连续的字母抓取单词,例如“ppeople”,然后另一个正则表达式可以跳过第一个输入的双字符序列并生成“peeople”等等。基本思想是获取包含两个连续字符的单词的所有排列


这是否可以通过正则表达式实现,或者我应该只在列表中使用循环和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();
            }
        }
int index=temp.length();
对于(int i=0;i
很抱歉,没有一个正则表达式可以返回所有置换字符串。相反,我更喜欢使用递归方法,它将返回列表中的所有字符串

如果要这样做,请参阅

在C++中,STL算法中有一个函数,它调用给定字符串中的下一个置换字符串。 更新

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

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;
    }
}

现在,如果你想要几个组合,而不是全部组合,你应该根据长度、字符、重复次数等添加你自己的规则。

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

    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);
        }
    }
int index=temp.length();
对于(int i=0;i
“我应该在列表中使用循环和StringBuilder吗?”几乎总是这样。更好的方法是使用回溯递归构建字符串。如果您需要这样的东西,我可以为您编写一个代码段。我需要,但递归会比只使用StringBuilder或substring方法更好吗?我有一个摇摇晃晃的子字符串循环,它几乎达到了我想要的效果,但还不是很好。通过循环构建字符串可能比回溯昂贵。你需要正则表达式或jave代码吗?不寻找所有置换。我在寻找一些重复的组合。如果你有“hheelloo”,我想返回hhelo,heelo,你好,heloo。但是在你问题的第一行中,你提到了排列。好的,我会更新的。现在让我知道,你还想保持从左到右的字母顺序吗?
    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);
        }
    }