簡體   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