match
" に対して完全に一致する文字列のみがマッチするようになります。これを確認するために、コードを少し修正して試してみましょう。
using System;
using System.Linq;
using System.Text.RegularExpressions;
class Program
{
static bool IsExactWordMatch(string source, string pattern)
{
// 文字列を単語に分割(カンマや読点も区切り文字として扱う)
string[] sourceWords = Regex.Split(source, @"(、|。|\s)").Where(s => !string.IsNullOrWhiteSpace(s)).ToArray();
string[] patternWords = Regex.Split(pattern, @"(、|。|\s)").Where(s => !string.IsNullOrWhiteSpace(s)).ToArray();
// 単語数が異なる場合はマッチしない
if (sourceWords.Length != patternWords.Length)
return false;
// 各単語を順番に比較
return sourceWords.SequenceEqual(patternWords);
}
static void Main()
{
string A = "工具、機械及び器具部品";
Console.WriteLine("テストケース:");
string[] testCases = {
"工具、機械及び器具部品", // 完全一致
"機械及び器具部品", // 部分一致
"工具、機械および器具部品", // 「及び」が「および」に
"工具機械及び器具部品", // カンマなし
"工具、機械及び器具", // 最後の「部品」なし
"工具、機械及び器具部品。" // 最後に句点あり
};
foreach (var testCase in testCases)
{
bool result = IsExactWordMatch(A, testCase);
Console.WriteLine($"A: {A}");
Console.WriteLine($"B: {testCase}");
Console.WriteLine($"マッチ結果: {result}");
Console.WriteLine();
}
}
}
このスクリプトでは、`IsExactWordMatch` メソッドを以下のように変更しました:
元の文字列とパターンの単語数が完全に一致することを要求します。
`SequenceEqual` メソッドを使用して、分割された単語が完全に同じ順序で一致することを確認します。
この修正により、"工具、機械及び器具部品" に対して完全に一致する文字列のみがマッチするようになります。
スクリプトを実行すると、以下のような結果が得られるはずです:
"工具、機械及び器具部品" - マッチする(完全一致)
"機械及び器具部品" - マッチしない(部分一致のため)
"工具、機械および器具部品" - マッチしない(「及び」と「および」の違い)
"工具機械及び器具部品" - マッチしない(カンマの有無)
"工具、機械及び器具" - マッチしない(「部品」がない)
"工具、機械及び器具部品。" - マッチしない(最後の句点の有無)
この方法により、完全に同じ単語と句読点を持つ文字列のみがマッチするようになります。ただし、この厳密なマッチングは、些細な違い(例:スペースの数、全角・半角の違い)でもマッチしなくなる可能性があります。実際の使用ケースによっては、より柔軟なマッチング(例:文字の正規化、同義語の処理)が必要になる場合もあります。
using System;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
string pattern = @"(.*?)\s*[\((](?:千円|万円|億円)[\))]";
string[] inputs = {
"器具(千円)",
"部品(万円)",
"設備(億円)",
"材料(千円)"
};
foreach (string input in inputs)
{
string result = Regex.Replace(input, pattern, "$1");
Console.WriteLine($"{input} → {result}");
}
}
}