[英]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.