見出し画像

#87 正規表現 基本から

正規表現の問題集を買ったので、備忘録的に。
こまめに解いて、ちょくちょく更新していく予定。


任意の一文字 .

. で任意の一文字が探せる

任意の2文字 ..

..で任意の2文字が抽出できた

.の数を増やすと3文字や4文字など任意の文字が抽出できる

任意の一文字 ただし英数字アンスコに限る \w

\w で英数字アンスコを一文字抽出できる

任意の2文字 ただし英数字アンスコに限る \w\w

\w で英数字アンスコを2文字分抽出できる

\wの数を増やすと3文字や4文字など任意の英数字アンスコが抽出できる

ちなみにwはwordの略だそうです。

任意の一文字 英数アンスコ以外 \W

\W で英数字アンスコ以外を1文字分抽出できる 記号や2バイト文字やハイフン

任意の2文字 英数アンスコ以外 \W\W

\W で英数字アンスコ以外を2文字分抽出できる

\Wの数を増やすと3文字や4文字など任意の英数字アンスコ以外が抽出できる
英数字アンスコ以外、つまり記号や2バイト文字やハイフン。ハイフンやピリオドなどは英数字じゃないらしい。

任意の空白 \s

\sで全角半角スペース、タブを1つ抽出できる

他にも、改行や改ページもマッチするというけど、VSCodeだとマッチしなかった。

任意の空白以外2つ \S\S

\S で空白以外を2文字分抽出できる

\Sの数を増やすと3文字や4文字など任意の空白以外が抽出できる

任意の半角数字1つ \d

\dで半角数字を抽出できる

半角数字以外 \D

\Dで半角数字以外を抽出できる

ここまでが任意の1文字のみ(n == 1)を抽出できるメタキャラクター


ここからは任意の文字が0以上(n > 0)抽出できるメタキャラクターの紹介

0回以上の繰り返し 直前の文字*

直前の文字oが0回以上の繰り返し

1回以上の繰り返し 直前の文字+

直前の文字oが1回以上の繰り返し

n回の繰り返しにマッチする 直前の文字{n}

直前の文字 oが5回繰り返す

n回以上の繰り返しにマッチする 直前の文字{n,}

Gとdの間にoが2回以上続いてo以外の文字が入らないパターンの例
Yahoのoが2回以上続いて!が3回以上続くパターンの例

n回以上m回以下の繰り返しにマッチ 直前の文字{n, m}

Goのoが2回以上10回以下の繰り返しにマッチするパターン

0回または1回の出現にマッチ 直前の文字?

-がないか、1回あるかにマッチ 
文末のピリオドは、そのままだと.(任意の一文字)のメタキャラになるのでエスケープしている

下記のように書き換えも可能

-がないか(0回か)、1回あるかにマッチ

gulpのreplaceで正規表現を使う

EJS

<title>
        Document
    </title>
</head>
<body>
<ol class="breadcrumb">
        <li>ホーム</li>
        <li>その1</li>
        <li>その1詳細</li>
        <li>その1超詳細</li>
    </ol>
    <ul>
        <li>hoge</li>
        <li>huga</li>
    </ul>
    <ol class="test">
        <li>ホーム</li>
        <li>その1</li>
        <li>その1詳細</li>
        <li>その1超詳細</li>
    </ol>
    こんにちは
    <hr class="border" />
    <hr class="dots" />
    <hr />

gulpfile.js

function ejs1(){
  return gulp.src('./src/*.ejs')
  .pipe(replace(/(<ol class=\"breadcrumb\">)[\s\S]*?(<\/ol>)/g, '<ol>ほげ</ol>'))
  .pipe(replace(/(<title>)[\s\S]*?(<\/title>)/g, '<title>ほげ</title>'))
  .pipe(replace(/(hr.*) \/>/g, '$1>'))
  .pipe(ejs())
  .pipe(rename({ extname: ".html" }))
  .pipe(gulp.dest(GENERATED_PATH))
 }

html

<title>ほげ</title>
</head>
<body>   
    <ol>ほげ</ol>
    <ul>
        <li>hoge</li>
        <li>huga</li>
    </ul>
    <ol class="test">
        <li>ホーム</li>
        <li>その1</li>
        <li>その1詳細</li>
        <li>その1超詳細</li>
    </ol>
    こんにちは
   <hr class="border">
   <hr class="dots">
   <hr>

参考

正規表現の中で()で括られた部分はグループ化することができます。そしてグループにマッチした部分を置換時に$1で参照することにより部分置換を行える。() で括られたグループが多くなった場合も $1, $2, $3 ... にように$で始まる参照用変数を増やしていくことで対応できる。


この記事が気に入ったらサポートをしてみませんか?