我有以下字符串片段,我想在其中匹配 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/