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

回答編集履歴

3

修正

2018/09/24 03:22

投稿

katoy
katoy

スコア22328

answer CHANGED
@@ -45,8 +45,8 @@
45
45
 
46
46
  追記:
47
47
  split() を使わずに正規表現で数字部分を取り出す方法で書いてみました。
48
- 1 - 1999 の値の範囲の数値であることも正規表現でチェックすることは可能ですが、
48
+ 0 - 1999 の値の範囲の数値であることも正規表現でチェックすることは可能ですが、
49
- 範囲が 99 - 1998 なんてふうになったときに対応が困難です。
49
+ 範囲が 3 - 1998 なんてふうになったときに対応が困難です。
50
50
  数値範囲については、parseInt() してチェックするようにしています。
51
51
  (正規表現で 4 桁以内の数字列しか渡らないはずなので parse 時の Format 不正例外は発生しないはず)
52
52
  ```java

2

追記

2018/09/24 03:22

投稿

katoy
katoy

スコア22328

answer CHANGED
@@ -41,4 +41,59 @@
41
41
 
42
42
  小数点があったり、int の範囲外の大きな数値のチェックもできています。
43
43
  実行例:
44
- ![イメージ説明](bb79619cd07e7682aa1ea1fd26476132.png)
44
+ ![イメージ説明](bb79619cd07e7682aa1ea1fd26476132.png)
45
+
46
+ 追記:
47
+ split() を使わずに正規表現で数字部分を取り出す方法で書いてみました。
48
+ 1 - 1999 の値の範囲の数値であることも正規表現でチェックすることは可能ですが、
49
+ 範囲が 99 - 1998 なんてふうになったときに対応が困難です。
50
+ 数値範囲については、parseInt() してチェックするようにしています。
51
+ (正規表現で 4 桁以内の数字列しか渡らないはずなので parse 時の Format 不正例外は発生しないはず)
52
+ ```java
53
+ package teratail;
54
+
55
+ import java.util.regex.Matcher;
56
+ import java.util.regex.Pattern;
57
+
58
+ public class Parse {
59
+ // 数字を含んでいるか?
60
+ private final static Pattern pattern_0 = Pattern.compile("\d");
61
+ // "数値s数値s ... 数値" のパターンか?
62
+ private final static Pattern pattern_1 = Pattern.compile("^((\d{1,4})s)+(\d{1,4})$");
63
+
64
+ public static void main(String[] args) {
65
+ String STRS[] = {
66
+ "abcsABC",
67
+ "123",
68
+ "1111s334",
69
+ "1s2s3s4s5s6s7s8s9",
70
+ "1111s334s124s215s126",
71
+ "1111s334s124s215s1999",
72
+ "1111s334s124s215s2000",
73
+ "12ss3",
74
+ "1.2sabc",
75
+ "99999999999999999999999999999999999999999999999999s1"
76
+ };
77
+ for (String str : STRS) {
78
+ if (pattern_0.matcher(str).find()) {
79
+ System.out.println(check(str, pattern_1) + ":\t'" + str + "'");
80
+ }
81
+ }
82
+ }
83
+
84
+ static boolean check(String str, Pattern pattern) {
85
+ Matcher m = pattern.matcher(str);
86
+ if (!m.find()) {
87
+ return false;
88
+ }
89
+ int count = m.groupCount();
90
+ for (int i = 1; i <= count; i++) {
91
+ int x = Integer.parseInt(m.group(i).replace("s", ""));
92
+ if ((x < 0) || (1999 < x)) {
93
+ return false;
94
+ }
95
+ }
96
+ return true;
97
+ }
98
+ }
99
+ ```

1

code のペースト

2018/09/24 03:20

投稿

katoy
katoy

スコア22328

answer CHANGED
@@ -1,7 +1,42 @@
1
1
  split("s") してから処理をする方針で書いてみました。
2
2
 
3
3
  ```java
4
+ import java.util.regex.Pattern;
4
5
 
6
+ public class Parse {
7
+ public static void main(String[] args) {
8
+ String STRS[] = {
9
+ "abcsABC",
10
+ "123",
11
+ "1111s334s124s214s124",
12
+ "12ss3",
13
+ "1.2sabc",
14
+ "99999999999999999999999999999999999999999999999999s1"
15
+ };
16
+
17
+ Pattern pattern = Pattern.compile("\d");
18
+ for (String str : STRS) {
19
+ if (pattern.matcher(str).find()) {
20
+ System.out.println(check(str) + ":\t'" + str + "'");
21
+ }
22
+ }
23
+ }
24
+
25
+ static boolean check(String str) {
26
+ for (String num_str : str.split("s")) {
27
+ try {
28
+ int x = Integer.parseInt(num_str);
29
+ if ((x < 0) || (1999 < x)) {
30
+ return false;
31
+ }
32
+ } catch (NumberFormatException e) {
33
+ return false;
34
+ }
35
+ }
36
+ return true;
37
+ }
38
+ }
39
+
5
40
  ```
6
41
 
7
42
  小数点があったり、int の範囲外の大きな数値のチェックもできています。