使用Regex,我想删除文本文件中特定的带引号单词中的所有连字符。
场景:这段代码中,我需要在使用JsonConstructor(不荣誉JsonPropertyName属性***请参见下面的编辑***)反序列化Json字符串之前,从Json属性名称中删除连字符。
需要删除连字符的单词列表示例(引号应是匹配的一部分):
"monthly-amount"
"annual-amount"
"ask-for-shipping-address"
示例输入Json:
{
"id": "b9d7574f-5246-4c94-ade5-1d4e9b169afc",
"name": "James-John Moonly-Batcher"
"monthly-amount" : 2000,
"annual-amount" : 12000,
"ask-for-shipping-address" : false
}
预期输出Json:
{
"id": "b9d7574f-5246-4c94-ade5-1d4e9b169afc",
"name": "James-John Moonly-Batcher"
"monthlyamount" : 2000,
"annualamount" : 12000,
"askforshippingaddress" : false
}
请注意,在此示例中,名称和ID值中的连字符未删除。
我知道如何匹配列表中的单词,但我不明白的是如何使用匹配的单词并替换其中的所有连字符。
或者,如果可以构造一个不需要单词列表的正则表达式,它可以替换任何属性名称中的连字符(但不能替换属性值中的连字符),这也是受欢迎的。
我很想在我剩下的小头发被刮掉之前收到一些关于这个任务的投入。
编辑:
只有在我成功地应用了公认的答案之后,我才意识到我最初的问题是一个完全不同的问题:用于反序列化的类构造函数(JSON构造函数)的参数名称错误。
我误解了docs中关于JsonConstructor的参数名需要如何设置的内容,认为JSON构造函数的参数名需要与JSON中的名称匹配,而实际上,JSON构造函数的参数名需要与C#类的实际属性名匹配通过匹配C#类的属性名称,反序列化程序可以找到与构造函数参数名称对应的JsonPropertyName属性,从而可以找到要查找的JSON名称。
因此,有了正确的参数名,就不需要首先更改Json属性名。
2条答案
按热度按时间ep6jt1vc1#
另一种方法是完全跳过正则表达式,并通过使用
JsonNode
API(自.NET 6起可用)引入中间步骤来更改属性名称:06odsfpq2#
LookaroundAssert可用于检查每个连字符处的某些条件。
例如,前瞻 * 可以检查后面是否没有双引号和冒号:
See this demo at regex101或www.example.com上的C#替换演示tio.run
或者是一个否定的lookbehind,用于检查该行之前是否没有冒号。
Another demo at regexstorm和www.example.com上的C#替换演示tio.run
Stackoverflow Regex FAQ是一个很好的解释资源。在这些模式中使用的是一个
[^
取反字符类]
,dot,*
and+
quantifiers和shorthand\s
表示 * 空白 *。