java 正規表現による文字列の抽出について
ここに質問の内容を詳しく書いてください。
javaで正規表現による文字列の抽出を行い、変換するコードを書いています。
例えば「6(iztn2(4i))」について、アルファベットの前の数字はアルファベットを数字分繰り返し、()でくくられているものは()の中身を数字分繰り返したいです。「6(iztn2(4i))」の場合、期待される答えは
「iztniiiiiiiiiztniiiiiiiiiztniiiiiiiiiztniiiiiiiiiztniiiiiiiiiztniiiiiiii」となります。
しかしながら提供したコードで実行すると、返答は「6(iztn2(iiii))」となってしまいます。
コード内のコメント「ここまでは正しいコード」までのコードは正しいと思われますが、その後の正規表現で何か不具合が起きていると思われます。何が間違っているのでしょうか。
発生している問題・エラーメッセージ
エラーメッセージ
該当のソースコード
import java.util.*; import java.util.regex.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.next(); String str_p = ""; String str_pa = ""; Integer str_num = 0; String str_char = ""; String regex = "[0-9]+[a-z]"; Pattern p = Pattern.compile(regex); while(true){ Matcher m = p.matcher(str); if (m.find()){ str_p = m.group(); String regex_num = "[0-9]+"; String regex_char = "[a-z]"; String str_a = ""; Pattern p_num = Pattern.compile(regex_num); Pattern p_char = Pattern.compile(regex_char); Matcher mnum = p_num.matcher(str_p); Matcher mchar = p_char.matcher(str_p); if (mnum.find()){ str_num = Integer.parseInt(mnum.group()); } if (mchar.find()){ str_char = mchar.group(); } for(int i=1;i<=str_num;i++){ str_a = str_a + str_char; } str = str.replace(str_p, str_a); }else{ break; } } /*ここまでは正しいコードと思われる*/ System.out.println(str); String regex_a = "[0-9]+\([a-z]+\)"; /*正規表現がおかしい?*/ Pattern p_a = Pattern.compile(regex_a); while(true){ Matcher m_a = p_a.matcher(str); System.out.println(m_a.find()); if (m_a.find()){ str_pa = m_a.group(); System.out.println(str_pa); String regex_numa = "[0-9]+"; String regex_chara = "[a-z]+"; String str_aa = ""; Pattern p_numa = Pattern.compile(regex_numa); Pattern p_chara = Pattern.compile(regex_chara); Matcher m_numa = p_numa.matcher(str_pa); Matcher m_chara = p_chara.matcher(str_pa); if (m_numa.find()){ str_num = Integer.parseInt(m_numa.group()); } if (m_chara.find()){ str_char = m_chara.group(); } for(int i=1;i<=str_num;i++){ str_aa = str_aa + str_char; } str = str.replace(str_pa, str_aa); }else{ break; } } System.out.println(str); } }
試したこと
「6(iztn6(4i))6(qq)」で試した場合「6(iztn6(iiii))qqqqqqqqqqqq」となり、
「6(iztn6(4i))6(qq2(ai))」で試した場合「6(iztn6(iiii))qqaiaiqqaiaiqqaiaiqqaiaiqqaiaiqqaiai」となりました。
"))"の連続が悪さをしているのかと思ったのですがそうでもなく、なぜか最初の()つきのやつだけ拾ってくれないような感じです。
補足情報(FW/ツールのバージョンなど)
プログラミング初心者のため、汚いコードになっていると思いますが、ご容赦ください。
追加質問などありましたらご連絡ください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。