teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

正規表現を使って、文の先頭から見ていくプログラムを書いてみました

2017/05/15 05:52

投稿

nuiri1343
nuiri1343

スコア54

title CHANGED
File without changes
body CHANGED
@@ -26,4 +26,61 @@
26
26
  ```
27
27
 
28
28
  ###補足
29
- 実際にコードを書くのは自分で頑張りますので、ヒントだけでも教えていただけると幸いです。
29
+ 実際にコードを書くのは自分で頑張りますので、ヒントだけでも教えていただけると幸いです。
30
+
31
+
32
+ ###追記
33
+ 正規表現を使ったプログラムを書いてみたのですが
34
+ もっと効率よくならないか、悩んでいます。見ていただけませんでしょうか?
35
+ 今回は、"abc"と"cba"の変換なので、どちらも3文字ですが、文字数が違う場合も想定して書いてみました。
36
+
37
+ ```java
38
+ import java.util.Scanner;
39
+ import java.util.regex.Pattern;
40
+ import java.util.regex.Matcher;
41
+
42
+ public class Main{
43
+ public static void main(String[] args) {
44
+ Scanner sc = new Scanner(System.in);
45
+ String s = sc.nextLine(); //置換したい文字列を受け取る
46
+
47
+ //abcをcbaに、cbaをabcに置換する。
48
+
49
+ Pattern p1 = Pattern.compile("abc|cba");
50
+ Matcher m;
51
+
52
+ int next = 0; //分割点
53
+ String result = "";
54
+
55
+ while(true){
56
+ m = p1.matcher(s);
57
+ if(m.find()){
58
+ next = m.start();
59
+ result += s.substring(0,next); //マッチした手前までをresultへ入れる
60
+ s = s.substring(next); //resultに入れた分を削除
61
+
62
+ if(s.substring(0,3).equals("abc")){ //マッチしたのが"abc"だったら
63
+ result+="cba"; //resultに"cba"を入れる
64
+ if(s.length()==3){ //マッチした部分が文の最後だったら
65
+ break;
66
+ }
67
+ s = s.substring(3); //残りの部分をsに入れる
68
+ }else{
69
+ result+="abc";
70
+ if(s.length()==3){
71
+ break;
72
+ }
73
+ s = s.substring(3);
74
+ }
75
+
76
+ }else{
77
+ result += s;
78
+ break;
79
+ }
80
+ }
81
+ System.out.println(result);
82
+ }
83
+ }
84
+
85
+
86
+ ```