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

|
44
|
+

|
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 のペースト
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 の範囲外の大きな数値のチェックもできています。
|