正则表达式中的 $' 是如何工作的?

Posted

技术标签:

【中文标题】正则表达式中的 $\' 是如何工作的?【英文标题】:How does $' in a regex works?正则表达式中的 $' 是如何工作的? 【发布时间】:2021-09-03 04:11:51 【问题描述】:

问题

在http://regex101.com,据说'$ 将返回匹配后的源字符串的一部分。然而它对我来说不是这样。

示例

例如,我需要替换 JSON 中的文本。我需要在某些参数之后从 JSON 中删除一些文本。

 "ReportPackage": 
        "$id": "some id",
        "$type": "stuff",
        "ConnectionString": "REPLACE_HERE",
        "FtpConfiguration": 
            "$id": "some id",
            "$type": "some type",
            "Address": "some adress",
            "Password": "REPLACE_HERE",
            "Username": "REPLACE_HERE",
            "BaseDirectory": "some path"
        ,
        "PgConnectionString": "REPLACE_HERE"
    
,
"CurrentFederation": "",
"CurrentVirtualHost": "/",
"PgConnectionString": "REPLACE_HERE",
"PeriodicContinuationActivated": true

我需要替换标记为REPLACE_HERE的值。我可以使用四个单独的正则表达式,但我想使用一个(如果可能的话)。

我解决问题的尝试

我使用这个正则表达式$'((("Password")|("ConnectionString")|("PgConnectionString")|("Username")))(.*),,但它并没有像我想象的那样工作。我做错了什么?

【问题讨论】:

为什么不直接使用现有的解析器解析 json?比使用正则表达式更容易。 您误解了.NET regex reference。其实应该用在替换模式中,见“$'在替换字符串中包含匹配后输入字符串的所有文本 这是否意味着我应该创建类,然后在我创建的类中反序列化,然后更改必要的值,然后反序列化它。是不是容易多了? 您不能使用正则表达式安全地没有假设来操作JSON字符串。有了假设,你可以试试Regex.Replace(text, @"(?m)^(\s*""(?:Password|ConnectionString|PgConnectionString|Username)""\s*:\s*"")[^""]+", "$1") 不,这不是更容易或更难的问题。确保更换始终可靠是一个问题。如果"$type": "some text that that matches your regex", 你会有问题。 【参考方案1】:

您误解了.NET regex reference。事实上,$' 是一个有效的 substituion 模式,它不能用于在正则表达式模式中做你想做的事情。

$'   在替换字符串中包含匹配后输入字符串的所有文本。

在您的$'((("Password")|("ConnectionString")|("PgConnectionString")|("Username")))(.*), 模式中,$ 只需要字符串位置的结尾,并且由于$ 之后有更多模式,正则表达式将永远不会匹配任何字符串。

此外,使用正则表达式无法安全地操作 JSON 字符串没有假设

If 您的值不包含双引号,并且 if JSON 字符串按照您展示的方式缩进,您可以尝试

Regex.Replace(text, @"(?m)^(\s*""(?:Password|ConnectionString|PgConnectionString|Username)""\s*:\s*"")[^""]+", "$1")

在哪里

(?m) - 使 ^ 匹配行位置的开始 ^ - 行首 (\s*""(?:Password|ConnectionString|PgConnectionString|Username)""\s*:\s*"") - 捕获的第 1 组 \s* - 零个或多个空格 " - 一个 " 字符 (?:Password|ConnectionString|PgConnectionString|Username) - 列出的字符串之一 "\s*:\s*" - ": 用零个或多个空格括起来,然后是 " [^"]+ - 除了" 之外的一个或多个字符。

$1 替换模式用组 1 值替换匹配项。

请参阅regex demo。

要正确执行此操作,请解析 JSON 字符串并清除您需要的键值。见How can I parse JSON with C#?

【讨论】:

以上是关于正则表达式中的 $' 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式如何匹配excel文件

如何验证正则表达式工作错误

Linux grep 命令中的正则表达式详解

正则表达式是如何让你的网页卡住的

Python 正则表达式和版权符号

excel 利用正则表达式匹配工作表中的数据