使用正则表达式的模式匹配由数字替换

时间:2016-06-10 16:20:37

标签: java

我的程序是从用户那里拿一个大字符串,如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();


      }

    }

2 个答案:

答案 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)

以下是我从您的问题中理解的内容:

  • 用户字符串将是令牌的一些序列&#34; aaa&#34;和&#34; aba&#34;
  • 没有其他组合的&#39; a&#39;和&#39; b&#39;。例如,你不会得到&#34; aaabaa&#34;作为输入字符串&#34; baa&#34;无效..
  • 对于每个连续的3个字符的字符串,替换&#34; aaa&#34;用0和&#34; aba&#34;用1。

我猜这是一个家庭作业,旨在教你如何灾难性回溯的危险以及如何谨慎使用量词。

我的建议是分两部分来做:

  1. 使用单个字符识别并替换每个3个字母的字段。
  2. 用适当的值替换这些字符。 (&#39; 1&#39;或&#39; 0&#39;)
  3. 例如,首先构建一个类似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;,会导致错误。例如,ababaaaababaaaabab都会导致意外且可能不正确的结果。