正規表現
日本語 | 文字列の規則 |
英語 | regular expression |
ふりがな | せいきひょうげん |
フリガナ | セイキヒョウゲン |
ある文字列の「並び方の規則」を表した文字列のこと。
たとえば「あああ」は「『あ』が3つ並んだ文字列」、もしくは「『あ』が1つ以上並んだ文字列」と表現できる。
このような、特定の文字列が持つ規則・ルールを表現したものが「正規表現」である。
正規表現を用いることで、文字列が含む「特定の規則に則った箇所」を見つけ出すことができ、それを元に検索や置換を行うことができる。この検索・置換こそが正規表現を使用する目的である。
正規表現は特別な構文で記述する必要があり、その構文は「正規表現を処理するエンジン」によって異なるため、一概に「正規表現」と言っても、使用するエンジンによって実際の正規表現文字列は異なることになる。
J2SEにはPatternクラス及びMatcherクラスという正規表現を行うクラスがあり、これらのクラスを使用することで正規表現を用いた検索・置換が行える。
また、Stringクラスにも、正規表現検索を行うためのmatches()メソッドや、正規表現置換を行うreplaceAll()メソッドが存在する。StringクラスのreplaceAll()メソッドの使用方法については「置換」の項目を参照のこと。
「置換」と並び、連呼すると少し恥ずかしい言葉のひとつ。
たとえば「あああ」は「『あ』が3つ並んだ文字列」、もしくは「『あ』が1つ以上並んだ文字列」と表現できる。
このような、特定の文字列が持つ規則・ルールを表現したものが「正規表現」である。
正規表現を用いることで、文字列が含む「特定の規則に則った箇所」を見つけ出すことができ、それを元に検索や置換を行うことができる。この検索・置換こそが正規表現を使用する目的である。
正規表現は特別な構文で記述する必要があり、その構文は「正規表現を処理するエンジン」によって異なるため、一概に「正規表現」と言っても、使用するエンジンによって実際の正規表現文字列は異なることになる。
J2SEにはPatternクラス及びMatcherクラスという正規表現を行うクラスがあり、これらのクラスを使用することで正規表現を用いた検索・置換が行える。
また、Stringクラスにも、正規表現検索を行うためのmatches()メソッドや、正規表現置換を行うreplaceAll()メソッドが存在する。StringクラスのreplaceAll()メソッドの使用方法については「置換」の項目を参照のこと。
「置換」と並び、連呼すると少し恥ずかしい言葉のひとつ。
// Sample.java
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Sample
{
public static void main( String[] args )
{
// サンプルの文字列。
String sample = "あああいいいいいううういおお";
// 「い」が続く文字列を検索します。
String regex = "い+";
// 正規表現クラスPatternとMatcherを使用して検索します。
Matcher matcher = Pattern.compile( regex ).matcher( sample );
// 分割して出力してみます。
int end = 0;
while( matcher.find() )
{
// まずヒットした箇所より前を出力します。
System.out.println( sample.substring( end, matcher.start() ) );
// 次にヒットした箇所を出力します。
System.out.println( "Hit>" + sample.substring( matcher.start(), matcher.end() ) );
// ヒットの範囲の最後を取っておきます。
end = matcher.end();
}
// 最後に終わりの部分を出力します。
System.out.println( sample.substring( end, sample.length() ) );
// あああ
// Hit>いいいいい
// ううう
// Hit>い
// おお
// ちなみに、置換はString#replaceAll()を使うと簡単にできます。
// この使用例は「置換」の項目を参照してください。
}
}
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class Sample
{
public static void main( String[] args )
{
// サンプルの文字列。
String sample = "あああいいいいいううういおお";
// 「い」が続く文字列を検索します。
String regex = "い+";
// 正規表現クラスPatternとMatcherを使用して検索します。
Matcher matcher = Pattern.compile( regex ).matcher( sample );
// 分割して出力してみます。
int end = 0;
while( matcher.find() )
{
// まずヒットした箇所より前を出力します。
System.out.println( sample.substring( end, matcher.start() ) );
// 次にヒットした箇所を出力します。
System.out.println( "Hit>" + sample.substring( matcher.start(), matcher.end() ) );
// ヒットの範囲の最後を取っておきます。
end = matcher.end();
}
// 最後に終わりの部分を出力します。
System.out.println( sample.substring( end, sample.length() ) );
// あああ
// Hit>いいいいい
// ううう
// Hit>い
// おお
// ちなみに、置換はString#replaceAll()を使うと簡単にできます。
// この使用例は「置換」の項目を参照してください。
}
}
// Sample.java import java.util.regex.Pattern; import java.util.regex.Matcher; public class Sample { public static void main( String[] args ) { // サンプルの文字列。 String sample = "あああいいいいいううういおお"; // 「い」が続く文字列を検索します。 String regex = "い+"; // 正規表現クラスPatternとMatcherを使用して検索します。 Matcher matcher = Pattern.compile( regex ).matcher( sample ); // 分割して出力してみます。 int end = 0; while( matcher.find() ) { // まずヒットした箇所より前を出力します。 System.out.println( sample.substring( end, matcher.start() ) ); // 次にヒットした箇所を出力します。 System.out.println( "Hit>" + sample.substring( matcher.start(), matcher.end() ) ); // ヒットの範囲の最後を取っておきます。 end = matcher.end(); } // 最後に終わりの部分を出力します。 System.out.println( sample.substring( end, sample.length() ) ); // あああ // Hit>いいいいい // ううう // Hit>い // おお // ちなみに、置換はString#replaceAll()を使うと簡単にできます。 // この使用例は「置換」の項目を参照してください。 } }