繁体   English   中英

在C#中,如何通过Regex.Replace()函数获取所有替换的开始/结束索引

[英]In C#, how can I get the start/end indexes of all the replacements by the Regex.Replace() function

我编写了一个程序来突出显示输入中与给定Regex表达式匹配的短语。

但是,我也想在输出面板中突出显示替换项。 为此,我需要获取Regex.Replace()找到的索引和长度。 不幸的是,C#似乎没有提供对此数据的访问权限。 我错过了什么吗?

我考虑过通过累加Regex.Matches()产生的MatchCollection给出的总和来手动尝试找出索引。 但这很容易出错,并且可能没有考虑替换表达式中的特殊$符号,这可能会使数字不正确。

必须有更优雅的方式。

--------------------编辑:

试图建立sarh的答案,到目前为止,我已经做到了:

public List<Tuple<int, int>> replacementIndexes;

public void mainbody() {
    replacementIndexes = new List<Tuple<int, int>>();
    filteredOutput = Regex.Replace(inputText, pattern, match => interceptReplacements(match, replacementText), regexOptions);
}

public string interceptReplacements(Match m, string replacement)
{
    replacementIndexes.Add(new Tuple<int,int>(m.Index,m.Length));
    return replacement;
}

不幸的是, interceptReplacements()方法使用输入中的OLD匹配索引,而不使用新的替换索引。 因此,我们需要保持冷静。 这是基于替换长度与匹配长度的差值的潜在“解决方案”:

int delta = 0;
public List<Tuple<int, int>> replacementIndexes;

public void mainbody() {
    delta = 0;
    replacementIndexes = new List<Tuple<int, int>>();
    filteredOutput = Regex.Replace(inputText, pattern, match => interceptReplacements(match, replacementText), regexOptions);
}

public string interceptReplacements(Match m, string replacement)
{
    replacementIndexes.Add(new Tuple<int,int>(m.Index+delta, replacement.Length));
    delta += replacement.Length - m.Length;
    return replacement;
}

起初它似乎起作用,但是现在出现了更大的问题。 $字符(替换中的字符)无法工作(被视为文字)。 所以我们回到正题。

Regex.Replace具有MatchEvaluator的重载它接受具有Index(起始位置)和Value属性的Match对象,Value可以提供匹配长度(您可以计算结束位置)。

编辑:用您的最新示例和我的评论,它将是这样的(不确定语法,现在没有VS。)

int delta = 0;
public List<Tuple<int, int>> replacementIndexes;
Regex rex;

public void mainbody() {
    delta = 0;
    replacementIndexes = new List<Tuple<int, int>>();
    rex = new Regex(pattern);
    filteredOutput = rex.Replace(inputText, match => interceptReplacements(match, replacementText), regexOptions);
}

public string interceptReplacements(Match m, string replacement)
{
    string replacementResult = rex.Replace(m.ToString(), replacement);
    replacementIndexes.Add(new Tuple<int,int>(m.Index+delta, replacementResult.Length));
    delta += replacementResult.Length - m.Length;
    return replacementResult;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM