正则表达式中的 $' 是如何工作的?
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#?
【讨论】:
以上是关于正则表达式中的 $' 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章