Java Regex生成具有连续字母的单词
我试图创建一个正则表达式,从我感兴趣的输入中提供一些组合对 如果我有以下输入 “人民” 我想创建以下排列 人,人,人,人,人 我目前可以使用以下两个正则表达式创建“people”和“ppeeople”,其中输入单词是“pppeeople”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
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);
}
}