0

我正在做一些 POS 标记分析,我需要替换一些标记。我正在使用正则表达式来识别标签:

Regex regex = new Regex(@"/(?<firstMatch>[^\s]+)( )");

//“/”和“”之间的任何内容,示例标签:/NN、/VB 等...

现在,我将标签名称放入 firstMatch 组,因此我可以像访问它们一样

foreach (Match m in regex.Matches(allText))
{
    Console.WriteLine(m.Groups["firstMatch"].Value);
}

我想要做的是用其他标签替换标签名称,具体取决于它的名称。就像,如果标签名称是 DTI,我想用 DT 替换它。如果是NNS,我想用NN替换它。依此类推,从我拥有的标签列表中。我可以这样做吗?我在想是否有匹配替换,所以我可以使用它。

谢谢!

4

2 回答 2

2
Dictionary<string,string> tags = new Dictionary<string,string>();

public string UpadeInput(String input)
{
    tags.Add("DTI", "DT");
    tags.Add("NNS", "NN");
    tags.Add("LongAnnoyingTag", "ShortTag");
    MatchEvaluator evaluator = new MatchEvaluator(ModifyTag);
    return Regex.Replace(input,@"(?<=/)(?<firstMatch>[^\s]+)(?= )", evaluator);
}

public string ModifyTag(Match match)
{
    return tags[match.Value];
}

编辑组合标签。

您可以更改ModifyTag方法以处理不同的情况。

public string ModifyTag(Match match)
{
    String tag = match.Value;
    if(!tag.Contains("+"))
    {
        return tags[match.Value];
    }
    else
    {
        string[] composedTags = tag.Split('+');
        return String.Format("{0}+{1}", tags[composedTags[0]], tags[composedTags[1]]);
    }
}
于 2013-03-29T13:58:17.450 回答
0

如果我理解你的问题

Regex.Replace(input,"/(?<firstMatch>[^\s]+)[^\s](?= )","$1");

这将用相同的标签名称替换标签名称,除了最后一个字符..

于 2013-03-29T13:47:01.070 回答