前回の続きですね。文字列関連です。
あ、何気に、この辺、Java SE 7 Gold の文字列処理の試験範囲ですので。
取得を目指している人は、さらっと読めるようになってないとピンチかも。
あれ??スピードマスターでも出るんかい!!おじさん、びっくりしたわぁ。
同じ翔泳社でつぶし合うのですね。でも、スピードマスターは問題集だからな。
ササッと受かりたい人は、問題集でもいいかもね。
参考書そろってきたなぁ・・・でも、Java SEは、もう8だしな。ついてけないわー。
1.文字列の切り出しpublic class JavaString3 {
public static void main(String [] args){
String st4 = "アサイー飲んで運動して健康な生活を送る" ;
System. out.print(st4.substring(0,1)+st4.substring(2,3)+st4.substring(9,11)+st4.substring(18));
}
}st4.substring(int index,int endIndex)
ということで、文字列の最初の切り出しと、切り出しの終わり位置を指定して文字を切り出します。
endIndexを指定しないと、切り出し位置から最後の位置までを表示します。
結果は、ちょっとしたクイズ。クイズでも何でもないですね。
あとで、別記事で紹介しますが、この切り出し技術があれば他サイトの更新情報をまるっと抜き取ることができます。
あくまで個人で楽しむだけになりますが、成形して自分で分かりやすいように使ったりできると思います。
2.正規表現あまり得意ではない。正規表現です。
正規表現の書き方って、言語依存な仕様になっていたりするので、
Rubyだったり、シェルスクリプトだったり、Javaだったりで分からなくなります。
勿論、今回は、Javaの正規表現です。
例えば、プログラムに使うユーザー名は、最初の文字は数字が禁止で
6文字のユーザー名で指定しなければならない場合のプログラムを作ります。
public class JavaString4 {
public static void main(String [] args){
String userName1 = "2man001";
String userName2 = "tw0Man";
String userName3 = "shadeday0" ;
System. out.println(userName1.matches("[a-zA-Z][a-zA-Z0-9]{5}" ));
System. out.println(userName2.matches("[a-zA-Z][a-zA-Z0-9]{5}" ));
System.out.println(userName3.matches( "[a-zA-Z][a-zA-Z0-9]{5}" ));
}
}結果は、
false
true
falseです。
正規表現って、全く触れたことがないとただの暗号ですよね。
matches を使って、一致する場合はtrue。それ以外はfalseと返すようにしています。
問題のここですが、
[a-zA-Z][a-zA-Z0-9]{5}まず初めに、[a-zA-Z]ですが、1文字目をアルファベットのa~z、またはA~Zと一致するとしています。
そして、[a-zA-Z0-9]{5}は、a~zとA~Zと1~9と一致するを5回繰り返すとしています。
String userName1は、1文字目が数字なのでNGですね。
String userName2は、1文字目がアルファベットで、残り5文字がアルファベット、または数字なのでOKです。
String userName3は、6文字以上なのでNGです。
もし、条件が、「6文字”以上”のユーザー名で指定しなければならない場合」であったなら、
System. out.println(userName3.matches( "[a-zA-Z][a-zA-Z0-9]{5,}" ));
とすればOKです。
数字の後に「,」をつけるだけです。
もし、条件が、6文字以上かつ8文字以内のユーザー名で指定しなければならない場合」であったなら、
System. out.println(userName3.matches( "[a-zA-Z][a-zA-Z0-9]{5,7}" ));
数字の後に「,7」と終点を指定するだけです。
何とかここまで理解したところで、混乱させますが、
実は、
System. out .println(userName1.matches("[a-zA-Z][a-zA-Z0-9]{5}" ));
System. out.println(userName0.matches( "[^\\d]\\w{5}" ));と書いても一緒なのです。
\\d(\d)は、「0-9」を意味しており、[^]は、否定になるので、「0-9以外」となります。
\\w(\w)は、[a-zA-Z]を意味しております。
よって結果は一緒なのです。
そして、私だけかな。正規表現の書き方で混乱するポイントはもう一つあって、
文字列の頭にAがつくという条件の時は、「^A」
文字列の最後ににZがつくという条件の時は、「Z$」を使います。
え?「^」は否定なんでしょ?行頭文字にも使うの?
先ほどの、否定は忘れて、下記コードを見てみましょう。
package test;
public class JavaString5 {
public static void main(String [] args){
String userName1 = "ABC" ;
String userName2 = "XYZ" ;
System. out .println(userName1.matches("^A\\w{2}" ));
System. out .println(userName2.matches("X\\wZ$" ));
}
}
ここでは、
1行目の出力文では、Aから始まり、[a-zA-Z]な3文字だった場合True
2行目の出力分では、Xから始まり、[a-zA-Z]な2文字目を持ち、Zで終わる場合Trueになります。
"^A"の場合は行頭指定、"[^A]"の場合は、A以外の文字列となります。
焦っていると間違えそうなので、ここは要注意ですね。
ちょっとグダグダですが、正規表現を使うと、文章の切り抜きが楽にできます。
またの機会にでも、実際のサイトから文章を切り抜いてみたいと思います。