Visual Basic サンプル集 |
Visual Basic 中学校 > Visual Basic サンプル集 > Visual Basic サンプル集目次 >
文字列から数値を抜き出す
2021/11/7
目次
文字列から数値を抜き出す
Dim value As String = "747年に納税者とは17歳から65歳までの男性で、1郷につき330人と定められた。" & vbCrLf &
"正倉院文書の戸籍の断簡を調べると17歳から65歳までの男子の割合は23.58%なので、" & vbCrLf &
"1郷の人口はおおよそ1399人となる。『和名類聚抄』では全国の郷が4041郷となっているので、" & vbCrLf &
"奈良時代当時の日本の人口は単純計算で1399人×4041郷で565万人となる。"
Dim results = System.Text.RegularExpressions.Regex.Matches(value, "[0-9]+\.?[0-9]*") '"\d+\.?\d*" でもOK
For Each result As System.Text.RegularExpressions.Match In results
Debug.WriteLine($"ヒット:{result.Value} 開始位置:{result.Index}")
'↓VB2013以前の場合
'Debug.WriteLine("ヒット:" & result.Value & " 開始位置:" & result.Index)
Next
これを実行すると次の通りに出力されます。
ヒット:747 開始位置:0
ヒット:17 開始位置:10
ヒット:65 開始位置:15
ヒット:1 開始位置:25
ヒット:330 開始位置:30
ヒット:17 開始位置:59
ヒット:65
開始位置:64
ヒット:23.58 開始位置:76
ヒット:1 開始位置:88
ヒット:1399
開始位置:98
ヒット:4041 開始位置:121
ヒット:1399 開始位置:155
ヒット:4041 開始位置:161
ヒット:565 開始位置:167
メモ:この例では、『数字の連続』または『間に . を1つ含む数字の連続』を抜き出しています。+ - や カンマなどは数値とみなされません。
文字列から数字 + 次の1文字 を抜き出す
Dim value As String = "747年に納税者とは17歳から65歳までの男性で、1郷につき330人と定められた。" & vbCrLf &
"正倉院文書の戸籍の断簡を調べると17歳から65歳までの男子の割合は23.58%なので、" & vbCrLf &
"1郷の人口はおおよそ1399人となる。『和名類聚抄』では全国の郷が4041郷となっているので、" & vbCrLf &
"奈良時代当時の日本の人口は単純計算で1399人×4041郷で565万人となる。"
Dim results = System.Text.RegularExpressions.Regex.Matches(value, "[0-9]+\.?[0-9]*.") '"\d+\.?\d*." でもOK
For Each result As System.Text.RegularExpressions.Match In results
Debug.WriteLine($"ヒット:{result.Value} 開始位置:{result.Index}")
'↓VB2013以前の場合
'Debug.WriteLine("ヒット:" & result.Value & " 開始位置:" & result.Index)
Next
これを実行すると次の通りに出力されます。
ヒット:747年 開始位置:0
ヒット:17歳 開始位置:10
ヒット:65歳 開始位置:15
ヒット:1郷 開始位置:25
ヒット:330人 開始位置:30
ヒット:17歳 開始位置:59
ヒット:65歳 開始位置:64
ヒット:23.58% 開始位置:76
ヒット:1郷 開始位置:88
ヒット:1399人 開始位置:98
ヒット:4041郷 開始位置:121
ヒット:1399人
開始位置:155
ヒット:4041郷 開始位置:161
ヒット:565万 開始位置:167
メモ:この例では、『数字の連続+1文字』または『間に . を1つ含む数字の連続+1文字』を抜き出しています。+ - や カンマなどは数値とみなされません。
文字列から数字 + 「人」 を抜き出す
Dim value As String = "747年に納税者とは17歳から65歳までの男性で、1郷につき330人と定められた。" & vbCrLf &
"正倉院文書の戸籍の断簡を調べると17歳から65歳までの男子の割合は23.58%なので、" & vbCrLf &
"1郷の人口はおおよそ1399人となる。『和名類聚抄』では全国の郷が4041郷となっているので、" & vbCrLf &
"奈良時代当時の日本の人口は単純計算で1399人×4041郷で565万人となる。"
Dim results = System.Text.RegularExpressions.Regex.Matches(value, "[0-9]+\.?[0-9]*人") '"\d+\.?\d*人" でもOK
For Each result As System.Text.RegularExpressions.Match In results
Debug.WriteLine($"ヒット:{result.Value} 開始位置:{result.Index}")
'↓VB2013以前の場合
'Debug.WriteLine("ヒット:" & result.Value & " 開始位置:" & result.Index)
Next
これを実行すると次の通りに出力されます。
ヒット:330人 開始位置:30
ヒット:1399人 開始位置:98
ヒット:1399人
開始位置:155
メモ:この例では、『数字の連続+人』または『間に . を1つ含む数字の連続+人』を抜き出しています。+ - や カンマなどは数値とみなされません。
「645年」や「2024年」など 4桁以内の数字 +「年」を抜き出す
Dim value As String = "富士山は864年の貞観大噴火や1707年の宝永大噴火など噴火を繰り返している。"
Dim results = System.Text.RegularExpressions.Regex.Matches(value, "[0-9]{1,4}年") '"\d{1,4}年" でもOK
For Each result As System.Text.RegularExpressions.Match In results
Debug.WriteLine($"ヒット:{result.Value} 開始位置:{result.Index}")
'↓VB2013以前の場合
'Debug.WriteLine("ヒット:" & result.Value & " 開始位置:" & result.Index)
Next
これを実行すると次の通りに出力されます。
ヒット:864年 開始位置:4
ヒット:1707年 開始位置:15
36以上の数値を抜き出す
Dim value As String = "国語80点,英語24点,数学33点,社会38点,理科100点。合計:275点。受験者2532人中1988位。"
Dim results = System.Text.RegularExpressions.Regex.Matches(value, "[0-9]+\.?[0-9]*") '"\d+\.?\d*" でもOK
For Each result As System.Text.RegularExpressions.Match In results
If CDec(result.Value) >= 36 Then
Debug.WriteLine($"ヒット:{result.Value} 開始位置:{result.Index}")
'↓VB2013以前の場合
'Debug.WriteLine("ヒット:" & result.Value & " 開始位置:" & result.Index)
End If
Next
これを実行すると次の通りに出力されます。
ヒット:80 開始位置:2
ヒット:38 開始位置:20
ヒット:100 開始位置:26
ヒット:275 開始位置:34
ヒット:2532 開始位置:42
ヒット:1988 開始位置:48
メモ:あまりないと思いますが数字の桁数が28桁を超えるとエラーになる場合があります。途中で CDec を使って36以上か判断しているためです。
メモ:文章中に含まれている桁数が事前にわかっている場合は、正規表現だけでも抜き出せます。たとえば、3桁以内の数値しか含まれていないのであれば、"3[6-9]|[4-9][0-9]|[1-9][0-9][0-9]" で 36以上だけ抽出できます。
35以下の数値を抜き出す
Dim value As String = "国語80点,英語24点,数学33点,社会38点,理科100点。合計:275点。受験者2532人中1988位。"
Dim results = System.Text.RegularExpressions.Regex.Matches(value, "[0-9]+\.?[0-9]*") '"\d+\.?\d*" でもOK
For Each result As System.Text.RegularExpressions.Match In results
If CDec(result.Value) <= 35 Then
Debug.WriteLine($"ヒット:{result.Value} 開始位置:{result.Index}")
'↓VB2013以前の場合
'Debug.WriteLine("ヒット:" & result.Value & " 開始位置:" & result.Index)
End If
Next
これを実行すると次の通りに出力されます。
ヒット:24 開始位置:8
ヒット:33 開始位置:14
メモ:あまりないと思いますが数字の桁数が28桁を超えるとエラーになる場合があります。途中で CDec を使って36以上か判断しているためです。
VB6では InStr などを使用します。Microsoft VBScript Regular Expressionsに参照設定をすれば正規表現も使用可能です。