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