Regex替换取决于匹配

本文关键字:取决于 替换 Regex | 更新日期: 2023-09-27 18:06:42

我正在研究一些post -tagger分析,我需要替换一些标签。我使用正则表达式来识别标签:

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

//之间的任何"/"answers"样品标签:/NN,/VB等…

现在,我将标签名称放入firstMatch组,因此我可以像

那样访问它们
foreach (Match m in regex.Matches(allText))
{
    Console.WriteLine(m.Groups["firstMatch"].Value);
}

我要做的是将标签名称替换为其他标签,具体取决于它的名称。例如,如果标签名称是DTI,我想将其替换为DT。如果它是NNS,我想用NN代替它。等等,从我拥有的标签列表中。我可以这样做吗?我在想是否有一个匹配替换,这样我就可以使用。

谢谢!

Regex替换取决于匹配

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]]);
    }
}

如果我理解你的问题

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

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