繁体   English   中英

使用正则表达式进行模式匹配以数字替换

[英]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语句。

这是我从您的问题中了解的内容:

  • 用户字符串将是令牌“ aaa”和“ aba”的某些序列
  • 将不会有“ a”和“ b”的其他组合。 例如,您将不会获得“ aaabaa”作为输入字符串,因为“ baa”无效。
  • 对于每个连续的3个字符串,将“ aaa”替换为0,将“ aba”替换为1。

我猜想这是一项作业,旨在教您有关灾难性回溯的危险以及如何谨慎使用量词的知识。

我的建议是分两部分进行:

  1. 确定并用单个字符替换每个3个字母的句段。
  2. 将这些字符替换为适当的值。 (“ 1”或“ 0”)

例如,首先构造一个像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”,都会导致错误。 例如, ababaaaababaaaabab都将导致意外的和潜在的错误结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM