我的程序是从用户那里拿一个大字符串,如aaaabaaaaaba
然后输出应该在给定的
模式中将aa替换为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(); } }
答案 0 :(得分:1)
使用正则表达式找到你可以搜索每个连续的匹配,然后根据输出的字符添加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());
如果你有&#34; aaaaaba&#34; (在第一个三联体中一个太多)作为输入,它将忽略最后一个&#34; a&#34;并输出&#34; 01&#34;。因此,有效三元组之间的任何无效字符都将被忽略。
如果你想要查看3的字符串块,可以使用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());
在这种情况下,如果三元组无效,它将被忽略,而且#3; 0&#34;也不是&#34; 1&#34;将被添加到输出中。如果你想在这种情况下做一些事情,只需在switch语句中添加一个default子句。
答案 1 :(得分:0)
以下是我从您的问题中理解的内容:
我猜这是一个家庭作业,旨在教你如何灾难性回溯的危险以及如何谨慎使用量词。
我的建议是分两部分来做:
例如,首先构建一个类似a([ab])a
的模式,以捕捉两个&#39;之间的字符(&#39; a&#39;或&#39; b&#39;) 。然后,使用Matcher类&#39; replaceAll方法用捕获的字符替换每个匹配。因此,输入aaaabaaaaaba' you get
abab`就是结果。最后,替换所有&#39; a&#39;用&#39; 0&#39;和所有&#39;&#39;与&#39; 1&#39;。
在Java中:
// Create the matcher to identify triplets in the form "aaa" or "aba"
Matcher tripletMatcher = Pattern.compile("a([ab])a").matcher(inputString);
// Replace each triplet with the middle letter, then replace 'a' and 'b' properly.
String result = tripletMatcher.replaceAll("$1").replace('a', '0').replace('b', '1');
当然,有更好的方法可以做到这一点,但这应该有效。我故意让代码密集而难以快速阅读。所以,如果这是一个家庭作业,请确保你完全理解它,然后自己重写。
另外,请记住,如果输入字符串不是&#34; aaa&#34;的序列,那么这将不起作用。和&#34; aba&#34;。任何其他组合,例如&#34; baa&#34;或&#34; abb&#34;,会导致错误。例如,ababaa
,aababa
和aaabab
都会导致意外且可能不正确的结果。