[英]pattern matching using regular expressions replace by digits
我的程序是从aaaabaaaaaba这样的用户那里获取一大串
那么在给定的模式下,输出应该用0代替aaa,用1代替aba
字符串,不应将一个序列一个接一个地插入每个序列中
个人,就像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。
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个字符串块,可以使用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语句。
这是我从您的问题中了解的内容:
我猜想这是一项作业,旨在教您有关灾难性回溯的危险以及如何谨慎使用量词的知识。
我的建议是分两部分进行:
例如,首先构造一个像a([ab])a
来捕获两个'a'之间的字符('a'或'b')。 然后,使用Matcher类的replaceAll方法将每个匹配项替换为捕获的字符。 因此,对于输入aaaabaaaaaba' you get
,结果为aaaabaaaaaba' you get
。 最后,将所有“ a”替换为“ 0”,并将所有“ b”替换为“ 1”。
在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');
当然,有更好的方法可以执行此操作,但这应该可行。 我故意离开了代码,使其难以快速阅读。 因此,如果这是一项家庭作业,请确保您完全理解它,然后自己重写。
另外,请记住,如果输入字符串不是“ aaa”和“ aba”的序列,则此操作将无效。 任何其他组合,例如“ baa”或“ abb”,都会导致错误。 例如, ababaa
, aababa
和aaabab
都将导致意外的和潜在的错误结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.