疲れたらやすむ

Javaを学ぶ上でハマったところを書いていきます。iPhoneアプリ開発や日常ネタもあるかも。

【macOS】【CentOS】VirtualBoxインストール編【環境構築】

ふと思い立って仮想環境構築を始めてみます。

ざっくり背景を言うと、ひとまず言語の知識は半人前くらいには付いてきたと思うのでちょっとインフラ系と言うか、サーバの基礎的な部分を学んでみようかなと。
Linux系のコマンドも業務で使用する機会があるのですが、結構当たり前のようにみなさん使っているので遅れを取らないためにも。

まずは仮想環境構築の第1弾、VirtualBoxのインストールです。

VM環境を作るスペック

今回私がVM環境を作るPCのスペックを載せておきます。

今までの職場はすべてWindowsのPCに仮想環境を構築していたので、初の試みとなりますがmacOSで構築します。

PC MacBook Pro 13-inch 2017
OS macOS Mojave 10.14.6
CPU 2.5 GHz Intel Core i7
メモリ 16 GB 2133 MHz LPDDR3
ストレージ 500 GB

こんな感じになっています。

もう少しでmacOSがメジャーアップデートされCatalinaになりますね。
せっかくなのでアップデートを待っても良かったのですが、思い立ったが吉日ということで。

ダウンロード

以下のサイトからダウンロードします。
と言うかすごくいまさら知ったのですが、VirtualBoxってOracleのソフトウェアだったんですね。

https://www.virtualbox.org

URLをクリックするとこんなページに飛びます。
左側のメニューの「Downloads」か大きな緑のバナーをクリックするとダウンロードページに移ります。

f:id:chibiCat:20191001004833p:plain

「OS X hosts」をクリックするとダウンロードが始まります。

f:id:chibiCat:20191001004841p:plain

インストール

ダウンロードしたdmgファイルを実行します。
Macユーザーなら一度は見たことがある画面だと思いますが、「VirtualBox.pkg」を「Applications」フォルダにドラッグ&ドロップします。

f:id:chibiCat:20191001004851p:plain

その後、「Applications」フォルダから「VirtualBox.pkg」を実行します。

「続ける」を選択。

f:id:chibiCat:20191001004857p:plain

同じく「続ける」を選択。

f:id:chibiCat:20191001004903p:plain

とくに設定はいじらず「インストール」を選択。

f:id:chibiCat:20191001004908p:plain

Macのログインユーザ(管理者ユーザ?)のパスワードを求められるので入力し「ソフトウェアをインストール」を選択。

f:id:chibiCat:20191001004914p:plain

ここで何やら問題発生。
とりあえず「"セキュリティ"環境設定を開く」を選択。

f:id:chibiCat:20191001011645p:plain

Oracleのソフトウェアがブロックされたよ〜という文言の横の「許可」を選択。

f:id:chibiCat:20191001004924p:plain

その後、もう一度同じ手順でインストールしてみます。

f:id:chibiCat:20191001004931p:plain

今度は成功しました!

VirtualBox起動

試しに実行してみます。

インストールに成功すると「Applications」や「Launchipad」に「VirtualBox」があるので実行します。

f:id:chibiCat:20191001004936p:plain

無事に起動も出来ましたね。

お疲れ様でした。

次の記事では、VirtualBoxにCentOSをインストールします。

【JavaScript】Dateの日付操作

今回はDateについて。

Javaから始めた身なので、JavaScriptのDateは良いような悪いような・・・というイメージがあります。
どっちつかずなんですが。

Dateの使い方

基本的な使い方から。

ソース

var date = new Date();
console.log(date);

実行結果

Tue Sep 03 2019 19:27:30 GMT+0900 (日本標準時) 

new Date()で現在日時の取得が出来ます。

これだけだと実用性は低いので、ここからフォーマットを指定して日時を表示したり、時間だけを表示したりするわけですね。

このあたりはサクッといっちゃいましょう。

時間や分などを個別で取得

ソース

var date = new Date(); // Tue Sep 03 2019 22:38:15 GMT+0900 (日本標準時) 

date.getFullYear(); // 2019
date.getMonth(); // 8
date.getDate(); // 3
date.getHours(); // 22
date.getMinutes(); // 38
date.getSeconds(); // 15

注意するのは月の取得ぐらいですかね。
月だけは-1された状態で取得するので、今月を表示させたいときは

date.getMonth() + 1; // 9

とする必要があります。

フォーマットを指定して日時を表示する

ソース

var date = new Date();
console.log(dateFormat(date));

function dateFormat(date) {
  format = "YYYY/MM/DD hh:mm:dd";
  format = format.replace(/YYYY/g, date.getFullYear());
  format = format.replace(/MM/g, date.getMonth() + 1);
  format = format.replace(/DD/g, date.getDate());
  format = format.replace(/hh/g, date.getHours());
  format = format.replace(/mm/g, date.getMinutes());
  format = format.replace(/dd/g, date.getSeconds());
  return format;
}

実行結果

2019/9/3 22:29:54 

こんな感じになってしまうんですかね。
formatに対して値を置換していくイメージですね。
JavaであればSimpleDateFormatで1発!って感じなのですが。


正直、この程度のフォーマットなら

ソース

var date = new Date();
console.log(dateFormat(date));

function dateFormat(date) {
  return date.getFullYear() + "/" + (date.getMonth() + 1) + "/" + date.getDate();
}

実行結果

2019/9/3 

みたいな感じでもアリかな〜と思っちゃいますよね。
もちろんフォーマット使っている方が可読性もありますしそれっぽくて見栄えは良いですけどね。

日付の加算・減算

ソース

var date = new Date();
console.log(date);

date.setDate(date.getDate() + 1);
console.log(date);

実行結果

Tue Sep 03 2019 23:25:41 GMT+0900 (日本標準時) 
Wed Sep 04 2019 23:25:41 GMT+0900 (日本標準時) 

加算したいセッターに、加算する値を取得するゲッター+加算する数値でOKです。

減算は+をーに変えればOKです。

ソース

var date = new Date();
console.log(date);

date.setDate(date.getDate() - 1);
console.log(date);

実行結果

Tue Sep 03 2019 23:25:41 GMT+0900 (日本標準時) 
Mon Sep 02 2019 23:25:41 GMT+0900 (日本標準時) 


そして、月末の日付に対し1日加算した場合どうなるか?なのですが。

ソース

var date = new Date();
date.setDate(0);
console.log(date);

date.setDate(date.getDate() + 1);
console.log(date);

実行結果

Sat Aug 31 2019 23:34:22 GMT+0900 (日本標準時) 
Sun Sep 01 2019 23:34:22 GMT+0900 (日本標準時) 

ちゃんと自動で判断して計算してくれますので使い勝手は良いです。

よく使う日付操作

ソース

var date = new Date();
console.log("本日 : " + dateFormat(date));

var yesterday = new Date(date.getFullYear(), date.getMonth(), date.getDate() - 1);
console.log("昨日 : " + dateFormat(yesterday));

var weekAgo = new Date(date.getFullYear(), date.getMonth(), date.getDate() - 7);
console.log("1週間前 : " + dateFormat(weekAgo));

var monthStart = new Date(date.getFullYear(), date.getMonth(), 1);
console.log("月初 : " + dateFormat(monthStart));

var monthEnd = new Date(date.getFullYear(), date.getMonth() + 1, 0);
console.log("月末 : " + dateFormat(monthEnd));

var monthAgo = new Date(date.getFullYear(), date.getMonth() - 1, date.getDate());
console.log("先月 : " + dateFormat(monthAgo));

function dateFormat(date) {
  var format = "YYYY/MM/DD";
  format = format.replace(/YYYY/g, date.getFullYear());
  format = format.replace(/MM/g, date.getMonth() + 1);
  format = format.replace(/DD/g, date.getDate());
  return format;
}

実行結果

本日 : 2019/9/4 
昨日 : 2019/9/3 
1週間前 : 2019/8/28 
月初 : 2019/9/1 
月末 : 2019/9/30 
先月 : 2019/8/4 

月の加減算については月ごとに末日の日付が違う可能性が高いので、確実に月が-1されないケースもあります。

例えばこういうパターン。

ソース

var date = new Date(2019, 9,31);
console.log("今月 : " + dateFormat(date));

var monthAgo = new Date(date.getFullYear(), date.getMonth() - 1, date.getDate());
console.log("先月 : " + dateFormat(monthAgo));

function dateFormat(date) {
  var format = "YYYY/MM/DD";
  format = format.replace(/YYYY/g, date.getFullYear());
  format = format.replace(/MM/g, date.getMonth() + 1);
  format = format.replace(/DD/g, date.getDate());
  return format;
}

実行結果

今月 : 2019/10/31
先月 : 2019/10/1

正しいような正しくないような。
とりあえずこういうケースがあるということは頭に入れておいた方が良いと思います。

【HTML】【JavaScript】基本的なインプット系とたまに使うなんやかんや

最近、仕事柄フロントエンドの開発をする機会が増えました。
ようやくある程度は頭に入ってきたので、逐一調べなくても基本的なものは書けるように。
復習と備忘録としてブログにアウトプットしておきます。

テキストフィールド

・基本的なやつ
何でも入力可能。

<input type="text" />


・数字のみ
半角数字と+、-のみしか入力出来ない。
入力欄の右側にスピンボタン(矢印)が表示され、入力欄内の数値を増減出来る。

<input type="number" />


・何でも入力出来るが初期入力時は半角入力になる
telなので電話番号専用かと思っていましたが何でも入力可能です。
入力欄がアクティブになった時点で半角入力になるので、最初から半角入力させたい時はこれ便利。

<input type="tel" />


・値の取得
「値を表示」ボタン押下で入力欄の値を取得しアラートで表示させます。
document.getElementById()でHTMLタグのidを指定し、後ろに.valueを付けてあげると中身の値を取得出来ます。

function alertValue() {
	 textFieldValue = document.getElementById("textField").value;
	 alert(textFieldValue);
}
<input type="text" id="textField" />
<input type="button" value="値を表示" onClick="alertValue();" />

 


・初期入力が半角かつ、入力を半角数字のみに制限
JavaScriptで半角数字のみの入力制限を設けます。
半角数字の判定は正規表現で行い、半角数字以外は空白に置換するようにしています。

function checkInput($this) {
	 var replaceValue = $this.value.replace(/[^\d]/,'');
	 if($this.value != replaceValue) {
	 	$this.value = replaceValue;
	 }
}
<input type="tel" onInput="checkInput(this)" />

JavaScriptのif文不要かな?思いつつ、とりあえず書いちゃいました。
やっていることは、置換前と置換後の文字列が違う場合は書き換えるように制御しているだけです。
置換後が同じ場合でも書き換えるように判定なしで直接代入すれば1行で済みますね。
お好みで。

ラジオボタン

・基本的なやつ

<input type="radio" />


・複数
グループ化はnameを統一すればOKです。
各ラジオボタンの識別にはidを使用します。

<input type="radio" id="radio1" name="radioGroup" />
<input type="radio" id="radio2" name="radioGroup" />
<input type="radio" id="radio3" name="radioGroup" />

  


・チェック状態の取得
「チェック状態を表示」ボタン押下でラジオボタンのチェック状態を取得しアラートで表示させます。
document.getElementById()でHTMLタグのidを指定し、後ろに.checkedを付けるとチェック状態を取得出来ます。

function alertRadioChecked() {
	checked = document.getElementById("radio1").checked;
	alert(checked);
}
<input type="radio" id="radio1" />
<input type="button" value="チェック状態を表示" onClick="alertRadioChecked()" />

 


・グループでチェックされているものを取得
グループ化されているものを取得するには、document.getElementsByName()を使用します。
何気にElementsなのが注意。

function alertRadiosChecked() {
	radios = document.getElementsByName("radioGroup2");
	for(i = 0; i < radios.length; i++) {
		if(radios[i].checked) {
			alert(radios[i].id + " checked");
			return;
		}
	}
	alert("no checked");
}
<input type="radio" id="radio4" name="radioGroup2" />
<input type="radio" id="radio5" name="radioGroup2" />
<input type="radio" id="radio6" name="radioGroup2" />
<input type="button" value="チェック状態を表示" onClick="alertRadiosChecked()" />

   


・コントロールキー+クリックでオフにする
ちなみにオフの状態でコントロール+クリックをしてもオフのままです。

function offRadio() {
	var ctrlPress = window.event.ctrlKey;
	if(ctrlPress) {
		document.getElementById("ctrlOffRadio").checked = false;
	}
}
<input type="radio" id="ctrlOffRadio" onClick="offRadio()" />


・クリックでチェック状態を反転させる
1つ上と似ていますがオフではなく反転させるパターン。
動きとしてはチェックボックスと同じ様な感じになります。

var radioValue;

function changeRadio($this) {
	if(radioValue) {
		$this.checked = false;
		radioValue = false;
	} else {
		radioValue = true;
	}
}
<input type="radio" onClick="changeRadio(this)" />



チェックボックス

・基本的なやつ

<input type="checkbox" />


・複数
ラジオボタンと同じでnameは統一、idは個別。

<input type="checkbox" id="checkbox1" name="checkboxGroup" />
<input type="checkbox" id="checkbox2" name="checkboxGroup" />
<input type="checkbox" id="checkbox3" name="checkboxGroup" />

  


・チェック状態を取得
「チェック状態を表示」ボタン押下でチェックボックスのチェック状態を取得しアラートで表示させます。
document.getElementById()でHTMLタグのidを指定し、後ろに.checkedを付けるとチェック状態を取得出来ます。

function alertCheckboxChecked() {
	checked = document.getElementById("checkBox").checked;
	alert(checked);
}
<input type="checkbox" id="checkBox" />
<input type="button" value="チェック状態を表示" onClick="alertCheckboxChecked()" />

 


・グループでチェックされているものを取得
チェックされていない場合のロジックとか書いて長いファンクションになりましたが、ラジオボタンと同じでdocument.getElementsByName()でグループを取得。
そしてfor文で回してチェック状態を判定します。

function alertCheckboxesChecked() {
	checkboxes = document.getElementsByName("checkboxGroup2");
	checkedId = "";
	for(i = 0; i < checkboxes.length; i++) {
		if(checkboxes[i].checked) {
			if(checkedId != "") {
				checkedId = checkedId + ", ";
			}
			checkedId = checkedId + checkboxes[i].id;
		}
	}
	if(checkedId != "") {
		alert(checkedId + " checked");
	} else {
		alert("no checked");
	}
}
<input type="checkbox" id="checkbox4" name="checkboxGroup2" />
<input type="checkbox" id="checkbox5" name="checkboxGroup2" />
<input type="checkbox" id="checkbox6" name="checkboxGroup2" />
<input type="button" value="チェック状態を表示" onClick="alertCheckboxesChecked()" />

   


随時更新します。

【Java】定数の定義と使用

今回は定数について。

どこかのプロジェクトに参画したら、必ずと言って良いほど目にする定数。
でも、私が参画したプロジェクトには未だ定数を定義しているものがありませんでした。
定数を使わずベタ書きで一旦はリリースを終え、機能追加を行う頃にはもはや全て定数に直すのは遠慮させて頂きたいレベル。

こういうのは気づいた時に直さないと、後々手がつけられなくなってしまいます。
直している暇があれば良いですが。
定数に直すだけでなくテストも必要になりますからね。意外と大変です。

定数とは

まず定数とは、一度代入したら後から変更出来ない値のことです。

対して、後から変更出来る値は変数と言います。
基本的にソースでどんどん宣言していくのは変数です。

ログに出す文字列はソースにベタ書きでも良いかもしれませんが、文字列の比較などに使用する際は定数で定義しておくのが良いと思います。
ベタ書きではスペルミスでバグを生む可能性もありますし、複数のファイルで同じ文字列を修正する場合はGrepして置換する面倒な作業が増えます。

定数は下記の様に記述します。

static final String STR_A = "A";

一般的なルールとしては、
・static finalで宣言する
・命名はは大文字と、区切りはアンダーバー
ぐらいでしょうか。

ちなみに、宣言時はアクセス修飾子(publicやprivate)を基本的に付けます。
その辺りは使用する状況に応じて。

あと、何気に忘れてしまいがちなのが各修飾子の順番。
アクセス修飾子も付けるなら

public static final String STR_A = "A";

となります。

アクセス修飾子 static修飾子 final修飾子」の順です。

クラス内で定数を宣言する方法

比較的使用する敷居は低いかと思います。

クラス内で定数を宣言し、そのクラスでのみ使用します。

Main.java

public class Main {

	private static final String STR_A = "A";
	private static final String SPACE = " ";

	public static void main(String[] args) {
		System.out.println(STR_A + SPACE + STR_A);
	}
}

実行結果

A A

メリットは他のクラスに影響を及ぼさないこと・・・ぐらいでしょうか。
逆に言えば、他のクラスで同じ定数を使いたくても使えないので、同じ定数を色んなクラスで使いまわしたい時はこの方法は避けた方が良いと思います。

既存のソースは定数を使っておらず、新規に改修する部分だけでも定数にしたい!という時はこの方法も選択肢の1つって感じですね。
ただ、それでも恒久対策とは言い難い気はします。
せっかく定数を使用するなら、定数クラスを使用する方が便利です。
コストと相談ですね。

定数クラスを用意する方法

多分一般的。
基本的にどのプロジェクトも定数クラスはあるはず。
ただ単にConstant.javaとかいう名前だったり、もう少し細かく◯◯Constant.javaだったり。
後者の方が、1つのファイルが肥大化しないので良いと思います。
逆に前者の様な名前だと、何でもかんでもそのファイルに定数を定義してしまい、何の定数が定義されているのか分かりづらいですし見るのも大変です。

使用例はこんな感じです。

FruitsConstant.java

public class FruitsConstant {

	public static final String APPLE = "リンゴ";
	public static final String ORANGE = "オレンジ";
}

Main.java

public class Main {
	public static void main(String[] args) {
		System.out.println(FruitsConstant.APPLE + "と" + FruitsConstant.ORANGE + "を買います。");
	}
}

実行結果

リンゴとオレンジを買います。

定数クラスに定義している定数を変更すれば、すべての呼び出し元に影響があります。
これはメリットでもあり、場合によってはデメリットと言うか、気をつけなければならない部分ですね。
こっちのクラスでは変更したかったけど、違うクラスではそのままの定数を使いたかった!みたいなことは避けたいです。

Enumを使用する方法

以前書いたこちらの記事にまとめてあります。

www.chibicat.net

ざっくり説明すると、Enumは複数の定数をまとめておくことが出来る列挙型と言うものです。
定数クラスの代わりにEnumを使用するイメージですね。

紐付けておきたい定数同士がある場合に使用するのが良いかと思います。
DBに格納されている複合キーの値とか。


今回は以上になります。

【Java】いつも悩む正規表現

今回は正規表現についての記事になります。

たまに使う機会があるのですが、毎回1時間ほど試行錯誤してしまうのでメモ的な意味も含めて。
ちゃんと理解しないと意外と扱いが難しいと感じます。

正規表現とは

説明しなくてもご存知だとは思いますが。

正規表現とは文字列のパターンを表現したものです。

何となく意味は伝わりますかね。
言葉よりも実物をお見せした方が早いかもしれません。

例えば、0〜9の数字1文字のパターンを正規表現で表すと[0-9]となります。

上記の正規表現では、例えばJavaで言う所の

String s1 = "1"
String s2 = "123"

など文字列の中に含まれている数字1文字ごとにマッチします。
文字列の中の数字は何がありますか?との問いに対する答えみたいな感じですね。
s1は1だけ、s2は1と2と3があります。それぞれ[0-9]の正規表現にマッチします。

Javaの場合は正規表現を扱う場面がいくつかあります。
単純に文字列の中にマッチする文字が含まれているか、もしくは文字列全体がマッチするか。
そして、正規表現に一致する文字列だけを置換したい場合など様々。

まずは用途別に見ていきましょう。

正規表現と一致する文字列が含まれているか

PatternとMatcherを用いて判定します。

Main.java

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
	public static void main(String[] args) {
		String s1 = "1";
		String s2 = "ABC9";
		String s3 = "ABCDE";

		Pattern pattern = Pattern.compile("[0-9]");

		Matcher matcher1 = pattern.matcher(s1);
		Matcher matcher2 = pattern.matcher(s2);
		Matcher matcher3 = pattern.matcher(s3);

		System.out.println(matcher1.find()); // true
		System.out.println(matcher2.find()); // true
		System.out.println(matcher3.find()); // false
	}
}

Patternクラスで正規表現を定義します。
次に、正規表現を定義したPatternクラスのmathcerメソッドの引数に判定を行う文字列を渡しMatcherを生成します。
生成したMatcherのfind()メソッドでは、文字列が正規表現を含んでいればtrueを返します。

文字列が正規表現とすべて一致するか

こちらもPatternとMatcherを用います。

Main.java

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
	public static void main(String[] args) {
		String s1 = "1";
		String s2 = "ABC9";
		String s3 = "ABCDE";
		String s4 = "123";

		Pattern pattern = Pattern.compile("[0-9]");

		Matcher matcher1 = pattern.matcher(s1);
		Matcher matcher2 = pattern.matcher(s2);
		Matcher matcher3 = pattern.matcher(s3);
		Matcher matcher4 = pattern.matcher(s4);

		System.out.println(matcher1.matches()); // true
		System.out.println(matcher2.matches()); // false
		System.out.println(matcher3.matches()); // false
		System.out.println(matcher4.matches()); // false
	}
}

Matcherクラスのmatchesメソッドで判定します。
[0-9]は0~9までの数字1文字に合致する正規表現なので、123は合致しません。
123に合致させたい場合は、例えば

Pattern pattern = Pattern.compile("[0-9]*");

としてあげると合致します。
ただし012などの0から始まる数字のみの文字列も合致してしまうので使用用途には注意。
この辺はいつも悩んじゃいます。

そして、PatternとMatcherを使わない方法も存在します。
こっちの方が簡単ですね。

Main.java

public class Main {
	public static void main(String[] args) {
		String s = "123";		
		System.out.println(s.matches("[0-9]*")); // true
	}
}

これだけです。

どっちが良いかはお好みですかね。
あとは、業務の場合はコーディング規約とか他のソースでどうやっているかで使い分けると良いと思います。

正規表現に一致した部分を取り出す

文字列の中で正規表現と一致するものを取り出す方法です。

Main.java

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
	public static void main(String[] args) {
		String s = "123";

		Pattern pattern = Pattern.compile("[0-9]");
		Matcher matcher = pattern.matcher(s);

		while (matcher.find()) {
			System.out.println(matcher.group());
		}
	}
}

実行結果

1
2
3

findメソッドで一致する部分だけループさせ、groupメソッドで取り出します。

正規表現と一致する箇所を置換する

一致した箇所だけを他の文字に置換させます。

Main.java

public class Main {
	public static void main(String[] args) {
		String s = "123ABC";
		System.out.println(s.replaceAll("[0-9]", "★"));
	}
}

実行結果

★★★ABC

StringのreplaceAllメソッドを使用します。
第1引数に正規表現、第2引数に置換後の文字を指定します。


ちなみにreplaceFirstメソッドで同じことをすると。

Main.java

public class Main {
	public static void main(String[] args) {
		String s = "ABC123";
		System.out.println(s.replaceFirst("[0-9]", "★"));
	}
}

実行結果

ABC★23

正規表現と一番最初に一致した箇所が置換されます。

replaceAllやreplaceFirstは、Matcherのfindメソッドと同等の条件となります。
そのため1文字ごとに正規表現と一致するか判定し、一致している場合は置換する動きをします。
もし、123を★に置換したいのであれば

Main.java

public class Main {
	public static void main(String[] args) {
		String s = "123ABC";
		System.out.println(s.replaceAll("[0-9]+", "★"));
	}
}

実行結果

★ABC

こんな感じの正規表現になります。
+は1回以上の繰り返し、*は0回以上の繰り返しを意味しています。
[0-9]*でも良いのでは?と思っていたのですが、試してみるとAとBの間などにも★が入っちゃいました。
0回以上なので、文字の間も合致しちゃうんですかね。

個人的正規表現まとめ

今まで苦労した正規表現をいくつかまとめておきます。

1から100までの数値
[1-9]|[1-9][0-9]|100

1から350まで
[1-9]|[1-9][0-9]|[1-2][0-9]{2}|3[0-4][0-9]|350

1から1000までの数値
[1-9]|[1-9][0-9]|[1-9][0-9]{2}|1000

数値の場合、型が変わるところで区切って考えるとわかりやすいと思います。
|(バーティカルバー)で区切ることで、「または」の条件として正規表現を記述出来ます。

ABC.EDFのドットから前の文字列
[A-Z]+\.

これでABC.にマッチします。
.や*など一部の特殊文字を正規表現として扱う場合はエスケープする必要があります。


ちなみに、正規表現を試すとき、1回1回書いてビルドして実行・・・とやっていると時間がかかってしまいます。
そんな時は、Web上で正規表現が完全一致、もしくは部分一致するかを試すことが出来るサイトがあります。

Regex Test Drive | 正規表現オンラインテストサイト

ここで試行錯誤してみるのも良いかもしれません。