c# - 是否可以使用匹配结果的反向引用作为另一个捕获组的匹配?

标签 c# .net regex regexp-replace backreference

我有以下字符串片段,我想在其中匹配 key 的内容属性并将其出现的所有内容替换为 *** :

name="prefix1 - key_string suffix1" displayName="prefix1 - key_string suffix2" key="key_string" name2="prefix2 - key_string suffix1" desc="prefix1 - key_string suffix1"

我可以轻松匹配属性值key_string类似于 (?<=key=")\b([^"]+)并将其替换为 ***所以它会读成 key="***" ,但似乎不知道如何替换其他 key_string使用反向引用的情况。

是否可能或者我需要将其分成 2 个正则表达式传递:1 个用于获取匹配结果,另一个用于替换匹配结果的出现?

最佳答案

key= 之后的双引号之间找不到字符串字符串,然后使用单个 Regex.Replace 替换整个输入字符串中找到的匹配项的所有匹配项操作。

这意味着将值保存到某个缓冲区,然后查找到字符串起始点并重新扫描整个输入字符串。这是不可能的,因为正则表达式引擎从左到右(默认情况下)或从右到左(使用 RegexOptions.RightToLeft 选项)搜索,但绝不允许重新绕回字符串开始扫描位置.

最接近的模式是 (?<=key=\"([^\"]+)\".*)\1|(?=.*key=\"([^\"]+)\".*)\2 (参见 its demo online )但是它是无用的,因为找到的匹配将保留,因为它是所有匹配的“枢轴”(如果之前将其删除,则环视将不匹配,并且它不能稍后将被删除,因为正则表达式索引将远远超过匹配项)。

因此,请使用两步方法,例如

var match = Regex.Match(text, @"\bkey=""([^""]+)""")?.Groups[1].Value;
if (!string.IsNullOrEmpty(match)
{
    sentence = sentence.Replace(match, ""); // If you just want to remove the found match anywhere inside the string
}

关于c# - 是否可以使用匹配结果的反向引用作为另一个捕获组的匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72618979/

相关文章:

c# - System.Windows.Forms.Timer 是否在与 UI 不同的线程上运行?

java - 按模式将文本脚本拆分为子字符串

c# - 嵌入 Webkit 时操作页面的最佳方式?

.net - 当只有一个元素存在时,锯齿状的PowerShell数组将丢失尺寸

c# - 将存储库公开为 IQueryable

javascript - 按出现次数替换匹配的正则表达式组

c# - C# 中的 Regex.Split 命令

C# 自定义项目模板

c# - $_FILES ['file' ] ['tmp_name' ] C# 中的等价物

c# - 优雅地刷新DataGridView中的数据