導入:なぜ「\h」を使うのか?
プログラミングでテキスト処理を行う際、「空白文字」の扱いに困ったことはありませんか?半角スペースだけでなく、タブ文字(\t)なども含めて「横方向の空白だけを検知したい」というケースは意外と多いものです。Java 8から導入された正規表現の「\h」は、まさにこの課題を解決するための強力な武器です。これを知っているだけで、複雑な置換処理やバリデーションが驚くほどシンプルになります。
基礎知識:\hとは何か?
正規表現における「\h」は、Horizontal whitespace(水平方向の空白文字)を指します。具体的には、通常の「半角スペース」や「タブ(\t)」、その他Unicodeで定義される水平方向の空白文字がこれに該当します。
従来の「\s」は、改行(\nや\r)などの「垂直方向の空白」まで含んでしまいます。もし「行をまたがずに空白だけを抽出・置換したい」という場合、「\s」を使うと意図せず改行までマッチしてしまいバグの原因になることがあります。ここで「\h」を使うことで、より正確な制御が可能になるのです。
実装:Javaでの活用方法
Javaで正規表現を扱う際は、java.util.regexパッケージのPatternクラスとMatcherクラスを使用します。特にJava 8以降であれば、「\h」を文字列内でそのまま利用可能です。ただし、Javaの文字列リテラルとして扱う際はバックスラッシュをエスケープする必要があるため、「\\h」と記述することに注意してください。
サンプルプログラム:水平空白を置換する
以下は、文字列内の連続する水平空白を、一つのカンマに置換するサンプルコードです。コピーしてそのまま実行してみてください。
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String[] args) {
// 対象となる文字列(半角スペースとタブが混在)
String input = “Java\tプログラミング 初心者 向け”;
// \\h は水平方向の空白文字(スペースやタブ)にマッチ
// + は1回以上の繰り返しを意味する
String regex = “\\h+”;
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
// 水平空白をカンマに置換
String result = matcher.replaceAll(“,”);
System.out.println(“変換前: ” + input);
System.out.println(“変換後: ” + result);
}
}
応用・注意点:現場で陥りやすい罠
1. バックスラッシュのエスケープ: Javaの文字列内では「\」はエスケープ文字です。そのため、正規表現として「\h」を渡すには「\\h」と書く必要があります。これを忘れるとコンパイルエラーになります。
2. 改行との違い: もし「改行も含めて空白として扱いたい」場合は、「\s」を使用してください。逆に「行レイアウトを崩したくない」場合は、必ず「\h」を選びましょう。
3. Named Groupsとの併用: 複雑なパターンを構築する際は、名前付きグループ((?
現場では、ログファイルの解析や、ユーザーが入力した住所などの整形処理で非常に役立ちます。ぜひ今日から「\h」を使いこなして、より堅牢なコードを書いてみてください。

コメント