我正在尝试创建一个正则表达式,它从我感兴趣的输入中为我提供了几个组合对。
如果我有以下输入......
“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();
}
}
答案 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);
}
}