我的程序是从用户那里获取一个大字符串,例如 aaaabaaaaaba
那么输出应该按照给定的模式将 aaa 替换为 0,将 aba 替换为 1
字符串不应该将一个序列放入另一个序列中,每个序列都是
个人和像 aaaabaaabaaaaba 这里 aaa-aba-aab-aaa-aba 是个人和
匹配时不应相互重叠,请帮助我获取此程序
example: aaaabaaaaaba input ended output is 0101
import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Pattern1 { Scanner sc =new Scanner(System.in); public void m1() { String s; System.out.println("enter a string"); s=sc.nextLine(); assertTrue(s!=null); Pattern p = Pattern.compile(s); Matcher m =p.matcher(".(aaa"); Matcher m1 =p.matcher("aba"); while(m.find()) { s.replaceAll(s, "1"); } while(m1.find()) { s.replaceAll(s, "0"); } System.out.println(s); } private boolean assertTrue(boolean b) { return b; // TODO Auto-generated method stub } public static void main(String[] args) { Pattern1 p = new Pattern1(); p.m1(); } }
最佳答案
使用 regex 和 find,您可以搜索每个连续的匹配项,然后根据输出的字符添加 0 或 1。
String test = "aaaabaaaaabaaaa";
Pattern compile = Pattern.compile("(?<triplet>(aaa)|(aba))");
Matcher matcher = compile.matcher(test);
StringBuilder out = new StringBuilder();
int start = 0;
while (matcher.find(start)) {
String triplet = matcher.group("triplet");
switch (triplet) {
case "aaa":
out.append("0");
break;
case "aba":
out.append("1");
break;
}
start = matcher.end();
}
System.out.println(out.toString());
如果您有“aaaaaba”(第一个三元组中的一个太多)作为输入,它将忽略最后一个“a”并输出“01”。因此,有效三元组之间的任何无效字符都将被忽略。
如果您想遍历 3 的字符串 block ,您可以使用 for 循环和 substring()
函数,如下所示:
String test = "aaaabaaaaabaaaa";
StringBuilder out = new StringBuilder();
for (int i = 0; i < test.length() - 2; i += 3) {
String triplet = test.substring(i, i + 3);
switch (triplet) {
case "aaa":
out.append("0");
break;
case "aba":
out.append("1");
break;
}
}
System.out.println(out.toString());
在这种情况下,如果三元组无效,它将被忽略,并且“0”和“1”都不会添加到输出中。如果您想在这种情况下执行某些操作,只需在 switch 语句中添加一个 default 子句即可。
关于java - 使用正则表达式的模式匹配用数字替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37752946/