私はタグのような文字列一致関数を実行しています。関数チェックには、少なくともタグごとに順序を維持しながら、可能な単語が文字列に含まれています。可能性のリストを事前に作成し、文字列に必要な各組み合わせが含まれているかどうかを確認するだけでよいことがわかりました
多分コードはそれをより明確にするでしょう。
List<List<string[]>> tags;
List<string[]> innerList;
List<List<string>> combinationsList;
public void Generate(string pattern)
{
// i will add whitespace removal later so it can be ", " instead of only ","
foreach (string tag in pattern.Split(','))
{
innerList = new List<string[]>();
foreach (var varyword in tag.Split(' '))
{
innerList.Add(varyword.Split('|'));
}
}
// atm i lack code to generate combinations in form of List<List<string>>
// and drop them into 'combinationsList'
}
// the check function will look something like isMatch = :
public bool IsMatch(string textToTest)
{
return combinationsList.All(tc => tc.Any(c => textToTest.Contains(c)));
}
たとえば、パターン:
「古い|若いジョン|ボブ、持っている|犬|猫を飼っている」
- タグ:
- リスト_1:
- {老若}
- {ジョン、ボブ}
- リスト_2
- {持っている、持っている}
- {犬猫}
- リスト_1:
したがって、combinationsList は次のようになります。
- 組み合わせリスト:
- リスト_1
- 「古いジョン」
- 「古いボブ」
- 「若いジョン」
- 「ヤングボブ」
- リスト_2
- 「犬を飼う」
- 「猫を飼う」
- 「飼っている犬」
- 「猫を飼う」
- リスト_1
したがって、結果は次のようになります。
- old bob have cat = true、List_1:"old bob" および List_2:"have cat" を含む
- young john have car = false, List_1:"young john" が含まれていますが、List_2 の組み合わせは含まれていません
コレクションを反復してそれらの組み合わせを取得する方法と、反復ごとに組み合わせを取得する方法がわかりません。また、古いジョンもジョン・オールドとして生成されないように、順序を台無しにすることはできません。
パターン内の「異体字」には、「犬 | 猫 | マウス」のように 2 つ以上の異体字が含まれる場合があることに注意してください。