0

「AKA」や「FKA」などのエイリアストークンを持つ可能性のある訴訟のキャプションを解析するエレガントな方法を探しています。エイリアス タイプと次のキャプションを取得する必要があります。私は力ずくで解決策を講じましたが、他にどのようなオプションがあるかを確認したいと思います。私はLinqが好きで、Spracheを試しましたが、頭を完全に包むことができませんでした。

Example caption:
JOHN SMITH AKA JOHN R SMITH FKA JOHNNY R SMITH  

Desired output: 
Alias Type Found: AKA   
Alias Caption Found: JOHN R SMITH   
Alias Type Found: FKA   
Alias Caption Found: JOHNNY R SMITH

以下は、これまでに LinqPad でまとめたものです。

void Main()
{
    var caption = "JOHN SMITH AKA JOHN R SMITH FKA JOHNNY R SMITH";
    caption.Split().ParseAliases( (t,c)=>{
        Console.WriteLine ("Alias Type Found: {0}",t);
        Console.WriteLine ("Alias Caption Found: {0}",c);
    });
}

public delegate void AliasRetrievedDelegate(string aliasType, string aliasCaption);

public static class ParserExtensions{
    private static IEnumerable<string> aliasTypes = new[]{"AKA","FKA"};

    public static void ParseAliases(this IEnumerable<string> tokens, 
        aliasRetrievedDelegate d, 
        int startIdx = 0){
                   // TODO

    }
}
4

1 に答える 1

0

これはあなたが望むほどエレガントではないかもしれませんが、うまくいきます。次の文字列のリストを使用してエイリアス タイプをグループ化します。次に、文字列を結合して、対応するエイリアス名を形成します。

public static class ParserExtensions
{
    private static IEnumerable<string> aliasTypes = new[]{"AKA","FKA"};

    public static void ParseAliases(this IEnumerable<string> tokens, 
        Action<string, string> d, 
        int startIdx = 0)
    {
        var aliases = tokens.Skip(startIdx)
                            .GroupMatchesWithTrailing(x => aliasTypes.Contains(x));
        foreach(var alias in aliases)
        {
            string aliasType = alias.Item1;
            string aliasName = string.Join(" ", alias.Item2.ToArray());
            d(alias.Type, alias.Name);
        }   
    }

注意が必要なのは、エイリアス タイプを対応する名前でグループ化することです。このメソッドは非常に冗長ですが、反復sourceは 1 回だけであり、遅延評価できます。もっと簡潔な解決策がありますが、それらにはトレードオフがあります。

    private static IEnumerable<Tuple<T, List<T>>> GroupMatchesWithTrailing<T>(
        this IEnumerable<T> source,
        Func<T, bool> predicate)
    {
        var items = source.SkipWhile(x => predicate(x) == false);
        using (IEnumerator<T> iterator = items.GetEnumerator())
        {
            bool hasItems = iterator.MoveNext();
            while(hasItems)
            {
                T match = iterator.Current;
                List<T> trailing = new List<T>();
                hasItems = iterator.MoveNext();
                while(hasItems && predicate(iterator.Current) == false)
                {
                    trailing.Add(iterator.Current);
                    hasItems = iterator.MoveNext();
                }
                yield return Tuple.Create(match, trailing);
            }
        }
    }
}
于 2012-09-30T02:36:36.350 に答える