ToolDeck

正規表現テスター

正規表現をテスト文字列に対して実行し、すべてのマッチ箇所をハイライト表示で確認できます

サンプルを試す

パターン

//g

テスト文字列

ローカルで実行 · シークレットの貼り付けも安全

正規表現とは?

正規表現(regex または regexp)は、検索パターンを定義する文字の並びです。正規表現テスターを使うと、パターンを記述してサンプルテキストに対して実行し、すべてのマッチ箇所をリアルタイムでハイライト表示できます。この概念は1950年代に数学者 Stephen Kleene が正規言語について研究したことに端を発し、1968年には Ken Thompson が QED テキストエディタに初めての正規表現エンジンを組み込みました。

正規表現エンジンはパターンを左から右に読み進め、マッチを試みながら入力文字を消費します。部分マッチが失敗した場合はバックトラッキングを行い、エンジンは一歩戻ってパターン内の別の経路を試みます。Go で使われている RE2 のように、バックトラッキングを一切行わないエンジンもあります。RE2 はパターンを決定性有限オートマトン(DFA)に変換することで線形時間のマッチングを保証しますが、その代わり後方参照などの機能はサポートしていません。

正規表現の構文は緩やかに標準化されています。最も広く使われているのは PCRE(Perl Compatible Regular Expressions)で、PHP、Python の re モジュール、JavaScript が細かな違いはありながらもこれをサポートしています。POSIX はより制限された構文を定義しており、grep や sed で使われています。言語間でパターンを移植する際にはこの違いが重要です。JavaScript で動作する先読みアサーションが、Go の RE2 エンジンではまったくコンパイルできない場合もあります。

オンライン正規表現テスターを使う理由

コードファイルで正規表現を書くと、パターンを修正するたびに保存・実行・結果確認が必要です。ブラウザベースの正規表現テスターはそのフィードバックループをゼロに縮めます。入力した瞬間にマッチが見えます。

リアルタイムのマッチハイライト
キーを押すたびにマッチ結果が即座に更新されます。テキストのどの部分がマッチしているか、どのキャプチャグループが値を持っているか、各マッチの開始位置と終了位置が正確にわかります。コンパイル・実行・デバッグのサイクルは不要です。
🔒
プライバシー優先の処理
パターンマッチングはブラウザ内で JavaScript の RegExp エンジンを使って実行されます。テキストもパターンもサーバーには送信されません。ログファイル、顧客データ、機密情報を含む API レスポンスに対してテストする際に重要な点です。
🔍
視覚的なマッチ確認
マッチ箇所はインラインでハイライトされ、位置とキャプチャグループの値が表示されます。マッチを視覚的に確認することで、量指定子のオフバイワンエラーやアンカーの抜けを発見しやすくなります。
🌐
ログインもインストールも不要
モダンブラウザがあればどのデバイスでも動作します。アカウント不要、拡張機能不要、IDE プラグイン不要。ページを開いてパターンとテキストを貼り付けるだけで、すぐにテストを始められます。

正規表現テスターの活用シーン

フロントエンドの入力バリデーション
メールアドレス、電話番号、クレジットカード番号フィールドのパターンを構築・検証し、HTML5 の pattern 属性や JavaScript のバリデーションロジックに組み込む前に確認できます。
バックエンドのログ解析
アプリケーションログからタイムスタンプ、エラーコード、IP アドレスを抽出する正規表現パターンを作成します。実際のログサンプルに対してテストし、パターンが正しいグループをキャプチャしていることを確認できます。
DevOps とインフラ
Nginx のロケーションブロック、Apache のリライトルール、Prometheus のアラートルールで使われている正規表現をデバッグします。サーバー設定でパターンが誤っていると、ルーティングが壊れたりアラートが見逃されたりします。
QA とテスト自動化
エンドツーエンドテストのアサーションで、レスポンスボディや HTML 出力が期待するパターンにマッチしているか検証します。テストスイートにコミットする前に、ここで正規表現を事前確認しましょう。
データ抽出パイプライン
非構造化テキストから構造化フィールドを抽出するパターンを試作します。商品価格のスクレイピング、CSV のエッジケース解析、メールヘッダーからのメタデータ取得などに活用できます。
正規表現の学習
メタキャラクター、量指定子、グループをサンプル文字列に対して試してみましょう。即座の視覚的フィードバックにより、ドキュメントを読むだけよりも正規表現の構文を習得しやすくなります。

正規表現構文クイックリファレンス

以下の表は最もよく使われる正規表現トークンをまとめています。JavaScript、Python、Go、PHP、および PCRE 互換エンジンの大部分で動作します。言語固有の拡張(Python の条件パターンや \k 構文を使った JavaScript の名前付きグループなど)はコード例のセクションで説明しています。

パターン名前説明
.Any characterMatches any single character except newline (unless s flag is set)
\dDigitMatches [0-9]
\wWord characterMatches [a-zA-Z0-9_]
\sWhitespaceMatches space, tab, newline, carriage return, form feed
\bWord boundaryMatches the position between a word character and a non-word character
^Start of string/lineMatches the start of the input; with m flag, matches start of each line
$End of string/lineMatches the end of the input; with m flag, matches end of each line
*Zero or moreMatches the preceding token 0 or more times (greedy)
+One or moreMatches the preceding token 1 or more times (greedy)
?OptionalMatches the preceding token 0 or 1 time
{n,m}Quantifier rangeMatches the preceding token between n and m times
()Capturing groupGroups tokens and captures the matched text for back-references
(?:)Non-capturing groupGroups tokens without capturing the matched text
(?=)Positive lookaheadMatches a position followed by the given pattern, without consuming it
(?<=)Positive lookbehindMatches a position preceded by the given pattern, without consuming it
[abc]Character classMatches any one of the characters inside the brackets
[^abc]Negated classMatches any character not inside the brackets
|AlternationMatches the expression before or after the pipe

正規表現フラグの解説

フラグ(モディファイアとも呼ばれます)はエンジンがパターンを処理する方法を変更します。JavaScript では閉じスラッシュの後に付加します: /pattern/gi。Python では第2引数として渡します: re.findall(pattern, text, re.IGNORECASE | re.MULTILINE)。すべてのフラグがすべての言語で使えるわけではありません。

フラグ名前動作
gGlobalFind all matches, not just the first one
iCase-insensitiveLetters match both uppercase and lowercase
mMultiline^ and $ match start/end of each line, not just the whole string
sDot-all. matches newline characters as well
uUnicodeTreat the pattern and subject as a Unicode string; enables \u{FFFF} syntax
yStickyMatches only from the lastIndex position in the target string

コード例

JavaScript、Python、Go、コマンドラインでの正規表現の実用例です。各例ではパターンの構築、マッチの抽出、出力を示しています。

JavaScript
// Match all email addresses in a string
const text = 'Contact us at support@example.com or sales@example.com'
const emailRegex = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g

const matches = text.matchAll(emailRegex)
for (const match of matches) {
  console.log(match[0], 'at index', match.index)
}
// → "support@example.com" at index 14
// → "sales@example.com" at index 37

// Named capture groups (ES2018+)
const dateRegex = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/
const result = '2026-03-30'.match(dateRegex)
console.log(result.groups)
// → { year: "2026", month: "03", day: "30" }

// Replace with a callback
'hello world'.replace(/\b\w/g, c => c.toUpperCase())
// → "Hello World"
Python
import re

# Find all IPv4 addresses
text = 'Server 192.168.1.1 responded, fallback to 10.0.0.255'
pattern = r'\b(?:\d{1,3}\.){3}\d{1,3}\b'

matches = re.findall(pattern, text)
print(matches)  # → ['192.168.1.1', '10.0.0.255']

# Named groups and match objects
date_pattern = r'(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})'
m = re.search(date_pattern, 'Released on 2026-03-30')
if m:
    print(m.group('year'))   # → '2026'
    print(m.group('month'))  # → '03'

# Compile for repeated use (faster in loops)
compiled = re.compile(r'\b[A-Z][a-z]+\b')
words = compiled.findall('Hello World Foo bar')
print(words)  # → ['Hello', 'World', 'Foo']
Go
package main

import (
	"fmt"
	"regexp"
)

func main() {
	// Find all matches
	re := regexp.MustCompile(`\b[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}\b`)
	text := "Contact support@example.com or sales@example.com"
	matches := re.FindAllString(text, -1)
	fmt.Println(matches)
	// → [support@example.com sales@example.com]

	// Named capture groups
	dateRe := regexp.MustCompile(`(?P<year>\d{4})-(?P<month>\d{2})-(?P<day>\d{2})`)
	match := dateRe.FindStringSubmatch("2026-03-30")
	for i, name := range dateRe.SubexpNames() {
		if name != "" {
			fmt.Printf("%s: %s\n", name, match[i])
		}
	}
	// → year: 2026
	// → month: 03
	// → day: 30

	// Replace with a function
	result := re.ReplaceAllStringFunc(text, func(s string) string {
		return "[REDACTED]"
	})
	fmt.Println(result)
	// → Contact [REDACTED] or [REDACTED]
}
CLI (grep / sed)
# Find lines matching an IP address pattern
grep -E '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' access.log

# Extract email addresses from a file
grep -oE '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}' contacts.txt

# Replace dates from YYYY-MM-DD to DD/MM/YYYY using sed
echo "2026-03-30" | sed -E 's/([0-9]{4})-([0-9]{2})-([0-9]{2})/\3\/\2\/\1/'
# → 30/03/2026

# Count matches per file in a directory
grep -rcE 'TODO|FIXME|HACK' src/
# → src/main.js:3
# → src/utils.js:1

よくある質問

正規表現とグロブパターンの違いは何ですか?
グロブパターン(*.txt や src/**/*.js など)はシェルやビルドツールでファイルパスのマッチングに使われる簡易ワイルドカード構文です。*(任意の文字列)、?(1文字)、[](文字クラス)をサポートしますが、量指定子、グループ、先読み、選択はありません。正規表現はより表現力が高く、ファイルパスだけでなく任意のテキストを対象にします。グロブパターン *.json は正規表現の ^.*\.json$ とほぼ等価です。
正規表現でリテラルのドットや括弧にマッチするには?
文字の前にバックスラッシュを付けます: \. はリテラルのピリオドに、\[ はリテラルの括弧にマッチします。文字クラス [] の内部では、ドットはすでにリテラルとして扱われるためエスケープは不要です。よくある間違いは、192.168.1.1 のようにドットをエスケープせずに書くことで、. が「任意の1文字」を意味するため 192x168y1z1 にもマッチしてしまいます。
テストデータはサーバーに送信されますか?
いいえ。このツールは JavaScript の RegExp エンジンを使ってブラウザ内で正規表現マッチングを完全に実行します。テキストやパターンを含むネットワークリクエストは一切発生しません。ツールを使用中にブラウザの DevTools の「ネットワーク」タブを開いて確認できます。
JavaScript では動くのに Python では失敗する正規表現があるのはなぜですか?
JavaScript と Python はわずかに異なる機能セットを持つ別々の正規表現エンジンを使用しています。JavaScript は ES2018 以降、\d、先読み (?=)、後読み (?<=) をサポートしていますが、条件パターン、アトミックグループ、所有的量指定子はサポートしていません。Python の re モジュールは \p{} Unicode プロパティクラスをサポートしていません(代わりにサードパーティの regex モジュールを使用してください)。常に対象言語のエンジンでテストするか、その言語の正規表現ドキュメントを参照してください。
正規表現で壊滅的なバックトラッキングが起きる原因は何ですか?
壊滅的なバックトラッキングは、パターンにネストされた量指定子があり、マッチング経路が指数的に増加するときに発生します。典型的な例は (a+)+ を a が続いた後に非マッチ文字がある文字列に適用するケースです。エンジンはマッチに失敗する前に、内側と外側のグループへの a の分割パターンをすべて試みます。アトミックグループ (?>)、所有的量指定子 a++、または曖昧な繰り返しを避けるパターンの書き直しで解消できます。
正規表現で HTML をパースできますか?
正規表現は HTML フラグメントから単純な値を取り出せます。たとえば単一の <a> タグから href を抽出するといった用途です。HTML 全体をパースする場合は適切なパーサーを使用してください(JavaScript の DOMParser、Python の BeautifulSoup、Go の html/template など)。HTML はコンテキストフリー文法であるのに対し、正規表現が扱えるのは正規文法です。ネストしたタグ、省略可能な属性、自己終了要素は、正規表現では確実にマッチできないパターンを生み出します。
欲張り量指定子と怠惰量指定子の違いは何ですか?
欲張り量指定子(* または +)はできる限り多くの文字にマッチしようとし、パターンの残りが失敗した場合にバックトラックします。怠惰量指定子(*? または +?)はできる限り少ない文字にマッチし、必要な場合にのみ拡張します。<b>one</b><b>two</b> という入力に対して、欲張りパターン <b>.*</b> は最初の <b> から最後の </b> まで文字列全体にマッチしますが、怠惰パターン <b>.*?</b> は <b>one</b> と <b>two</b> を別々にマッチします。