正则表达式取决于匹配

时间:2013-03-29 13:39:19

标签: c# regex pos-tagger

我正在进行一些POS-tagger分析,我需要更换一些标签。 我正在使用正则表达式来标识标记:

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替换它。依此类推,从我拥有的标签列表中。我能这样做吗? 我在想是否有匹配替换所以我可以使用它。

谢谢!

2 个答案:

答案 0 :(得分: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]]);
    }
}

答案 1 :(得分:0)

如果我理解你的问题

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

这将使用相同的标记名称替换标记名称,但最后一个字符除外。