<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="content-type" charset="utf-8">
<title>正規表現説明シート</title>
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+JP&display=swap" rel="stylesheet">
<link href="https://use.fontawesome.com/releases/v5.15.1/css/all.css" rel="stylesheet">
<link href="https://use.fontawesome.com/releases/v5.15.4/css/all.css" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="../jdmain.css">
<script type="text/javascript" src="../jdinit.js"></script>
<style>
p {
font-size: 1.1rem;
margin-bottom: 10px;
}
.program {
color: White;
background-color: black;
font-size: 20px;
margin-bottom: 1em;
}
td {
text-align: center;
font-weight: bold;
}
.red {
color: rgb(255, 70, 70);
font-size: 1.6rem;
}
.orengi {
position: relative;
background: linear-gradient(transparent 40%, #ffc58f 40%);
}
.explain {
font-size: 1.3rem;
padding-top: 10px;
padding-bottom: 30px;
margin: 0 auto;
line-height: 1.7;
font-size: 1.2rem;
}
h3 {
font-size: 1.4rem;
color: orange;
margin-bottom: 30px;
margin-top: 30px;
}
.icon {
margin-left: 40px;
margin-top: 30px;
margin-bottom: 30px;
}
.black {
background-color: black;
color: white;
}
.csv-li {
list-style: decimal;
text-align: left;
font-size: 1.2rem;
}
.explain-list {
color: #000;
}
.explain-list:hover {
color: blue;
}
.comment {
color: greenyellow;
}
.blue {
color: rgb(0, 255, 255);
}
@media screen and (max-width: 746px) {
p {
font-size: 0.8rem;
}
.red {
font-size: 1.2rem;
}
.explain {
font-size: 1.0rem;
padding-bottom: 30px;
}
h3 {
font-size: 1.2rem;
margin-bottom: 20px;
margin-top: 20px;
}
.icon {
margin-top: 20px;
margin-bottom: 20px;
}
li {
padding: 4px;
font-size: 1.0rem;
}
.section-title::before {
background-image: none;
vertical-align: baseline;
content: '';
position: absolute;
bottom: -20px;
display: inline-block;
width: 60px;
height: 5px;
left: 50%;
-webkit-transform: translateX(-50%);
transform: translateX(-50%);
background-color: rgb(255, 153, 0);
}
.section-title::after {
display: none;
}
.csv-li {
font-size: 0.8rem;
}
}
</style>
</head>
<body>
<header id="header">この部分は header.html に置き換わる</header>
<div class="wrapper">
<h1 class="section-title">正規表現教材</h1>
<section class="csv-list">
<ol class="csv-ol">
<a href="#about" class="explain-list">
<li class="csv-li">正規表現について</li>
</a>
<a href="#meta-str" class="explain-list">
<li class="csv-li">正規表現のメタ文字について</li>
</a>
<a href="#program" class="explain-list">
<li class="csv-li">例題プログラム</li>
</a>
</ol>
</section>
<section id="about">
<h2 class="section-title">正規表現について</h2>
<p class="explain">データから文字・文字列を検索するときにそれらのパターンを指定する一般的な表現方法を<span class="red">正規表現</span>といいます。<br>
調べたい文字・文字列が正規表現によってすぐに検索することができます。<br><br>
例えば、i(小文字)が含まれる文字・文字列の場合以下のように検索されます。<br>
<b><span style="color: red;">○</span></b>:i, programming, Application(小文字のiが含まれるので検索される。)<br>
<b><span sytle="color: blue;">×</span></b>:I, Image(大文字のIなので検索されない。)</p>
<h3>moji.csv</h3>
<div class="black">
<p style="padding-left: 10px;">moji<br>
i<br>
programming<br>
Application<br>
I<br>
Image<br></p>
</div>
<h3>kensaku1.rb</h3>
<div class="black">
<p style="padding-left: 10px;"><span class="blue">require</span> 'csv'<br>
<br>
data = CSV.read("moji.csv", headers: true)<br>
data<span class="blue">.each do</span> |row|<br>
<span class="blue">if</span> /i/ =~ row["moji"]<br>
puts row["moji"]<br>
<span class="blue">end</span><br>
<span class="blue">end</span>
</p>
</div>
<p>プログラムの解説<br>
正規表現:/(スラッシュ)で囲みます。<br>
=~:正規表現と文字列のマッチを行います。</p>
</section>
<section id="meta-str">
<h2 class="section-title">正規表現のメタ文字について</h2>
<p class="explain">文字・文字列以外に正規表現内で特殊な働きをする文字(メタ文字)で検索することができます。<br><br>
例えば</p>
<ul class="explain">
<li>同じ文字が1回以上続くものを取り出したい(はああい → はあ+い)</li>
<li>数字のみのデータを取り出したい(2024年 → \d+年)</li>
</ul>
<p class="explain">というようにメタ文字を組み合わせることで複雑なデータを検索することができます。<br>
※+と\dについては次の「主なメタ表一覧」を見て、マッチする文字列は何なのか、どのような例があるのか確認してみましょう。</p>
<h3>主なメタ文字一覧</h3>
<blockquote>
<table border="1" width="500" height="100">
<tr>
<td><b>メタ文字</b></td>
<td><b>マッチする文字列</b></td>
</tr>
<tr>
<th>.</th>
<th>なんでもいい1文字(改行を含まない)</th>
</tr>
<tr>
<th>*</th>
<th>直前の文字0回以上の繰り返し</th>
</tr>
<tr>
<th>+</th>
<th>直前の文字1回以上の繰り返し</th>
</tr>
<tr>
<th>?</th>
<th>直前の文字0回もしくは1回の繰り返し</th>
</tr>
<tr>
<th>文字列1|文字列2</th>
<th>どちらかにマッチすれば良い</th>
</tr>
<tr>
<th>\</th>
<th>直後のメタ文字を文字としてマッチさせる</th>
</tr>
<tr>
<th>\s</th>
<th>空白文字(スペース、タブ、改行など)</th>
</tr>
<tr>
<th>\S</th>
<th>空白文字以外</th>
</tr>
<tr>
<th>\d</th>
<th>0〜9の数字</th>
</tr>
<tr>
<th>\D</th>
<th>0〜9の数字以外</th>
</tr>
</table>
</blockquote>
<h3>主なメタ文字のマッチ例一覧</h3>
<blockquote>
<table border="1" width="500" height="100">
<tr>
<td>メタ文字</td>
<td>正規表現</td>
<td>マッチする</td>
<td>マッチしない</td>
</tr>
<tr>
<th>.</th>
<th>/o.k/</th>
<th>book</th>
<th>back</th>
</tr>
<tr>
<th>*</th>
<th>/.*on/</th>
<th>nippon</th>
<th>japan</th>
</tr>
<tr>
<th>+</th>
<th>/-+/</th>
<th>o-------i</th>
<th>oi</th>
</tr>
<tr>
<th>?</th>
<th>/ts?u/</th>
<th>tsu, tu</th>
<th>su</th>
</tr>
<tr>
<th>文字列1|文字列2</th>
<th>/cat|dog/</th>
<th>cat, dog</th>
<th>fox</th>
</tr>
<tr>
<th>\</th>
<th>/\+/</th>
<th>10+1</th>
<th>10-1</th>
</tr>
<tr>
<th>\s</th>
<th>/e\sa/</th>
<th>We are</th>
<th>Weare</th>
</tr>
<tr>
<th>\S</th>
<th>/a\Su/</th>
<th>aisatu</th>
<th>aisa tu</th>
</tr>
<tr>
<th>\d</th>
<th>/\dsai/</th>
<th>15sai</th>
<th>juugosai</th>
</tr>
<tr>
<th>\D</th>
<th>\/Dsai/</th>
<th>Juugosai</th>
<th>15sai</th>
</tr>
</table>
</blockquote>
</section>
<section id="program">
<h2 class="section-title">例題プログラム</h2>
<h3>kensaku.csv</h3>
<div class="black">
<p style="padding-left: 10px;">name,gakko,gakunen,kozukai<br>
公益太郎,三川八中,2,2000<br>
飯森花子,余目百中,1,4000<br>
鶴岡一人,タキタロウ小,4,200<br>
鶴岡二子,タキタロウ小,2,300<br>
遊佐梅子,丸池小,6,900</p>
</div>
<h3>kensaku2.rb</h3>
<div class="black">
<p style="padding-left: 10px;"><span class="blue">require</span> 'csv'<br>
<br>
data = CSV.read("kensaku.csv", headers: true)<br>
puts "学校で探す:1"<br>
puts "金額で探す:2"<br>
print "どれにしますか:"<br>
sel = gets.to_i<br>
<br>
<span class="blue">if</span> sel == 1<br>
print "探したい学校名を入れてください:"<br>
ptn = Regexp.new(gets.chomp)<br>
<span class="comment">#gets.chompで入力された文字列をRegexp.newにより正規表現に直す</span><br>
data<span class="blue">.each do</span> |row|<br>
<span class="blue">if</span> ptn =~ row["gakko"]<br>
printf("%sさんは%s%s年です\n", row["name"], row["gakko"], row["gakunen"])<br>
<span class="blue">end</span><br>
<span class="blue">end</span><br>
<span class="blue">elsif</span> sel == 2<br>
print "絞り込みしたい金額を入れてください:"<br>
gaku = gets.to_i<br>
data<span class="blue">.each do</span> |row|<br>
<span class="blue">if</span> gaku < row["gozukai"].to_i<br>
printf("%sさんは%d円もらっています\n", row["name"], row["kozukai"].to_i)<br>
<span class="comment">#csvから読んできたデータは全部文字列</span><br>
<span class="comment">#数字で比較するときは.to_iや.to_fを使う</span><br>
<span class="blue">end</span><br>
<span class="blue">end</span><br>
<span class="blue">else</span><br>
printf("%d番はありません。さようなら。\n", sel)<br>
<span class="blue">end</span><br>
</p>
</div>
</section>
<p style="color: green; font-size: 1.5rem; font-weight: bold;text-align: center;margin-top: 40px;">
正規表現を使ったプログラムを作成してみよう!!</p>
</div>
<footer id="footer">この部分は footer.html に置き換わる</footer>
</body>
</html>