好的,你那里有RegEx大师,我有一个给你。
我有一个JSON OpenAPI 文件我需要做一些预处理。
我需要将 operationId 值替换为摘要值的修改版本。
例如:
原始JSON (部分,人为因说明而异):
"post": {
"description": "Creates a constituent note.",
"operationId": "56b76471069a050520297722",
"summary": "Note (Create)",
"parameters": [
...
"post": {
"description": "Creates a constituent custom field.",
"operationId": "578d324da9db950becc619fe",
"someOtherField": "Some other value",
"summary": " Constituent custom field (Create)",
"parameters": [
...
(注意我们需要容纳的附加/小写单词/空格以及将其首字母大写。)
必需的JSON
"post": {
"description": "Creates a constituent note.",
"operationId": "NoteCreate",
"summary": "Note (Create)",
"parameters": [
...
"post": {
"description": "Creates a constituent custom field.",
"operationId": "ConstituentCustomFieldCreate",
"someOtherField": "Some other value",
"summary": "Constituent custom field (Create)",
"parameters": [
...
到目前为止,我可以接近, operationId 值与 summary 值完全相同。我遇到问题的是修改 operationId 值的摘要值。
您可以假设摘要字段位于 operationId 字段之后,但不是它立即 字段。也就是说,根据第二个示例块,可能还有一行或多行。
注意:我正在使用VB.NET,因此可能有其他处理方式,但我想尽可能简洁地进行。
答案 0 :(得分:0)
由于这是JSON数据,因此您无需使用Regex完成所有工作。如果您尚未使用JSON解析器,则可以使用它。
在正则表达式部分之前,您可以使用以下正则表达式模式来查找和替换summary
中不需要的字符:
(?:^|\W)+([a-zA-Z]?)
这将为您提供每个单词的第一个字母,前面有一个或多个单词边界。
使用快速辅助功能,您可以轻松地将输入转换为所需的输入:
Private Function GetOperationIdFromSummary(summary As String) As String
Const pattern As String = "(?:^|\W)+([a-zA-Z]?)"
Return Regex.Replace(summary, pattern, Function(m) m.Groups(1).Value.ToUpper)
End Function
使用Json.NET解析JSON字符串的完整示例:
Sub Main()
Dim jsonStr As String = "{
'description': 'Creates a constituent note.',
'operationId': '56b76471069a050520297722',
'summary': 'Note (Create)'
}".Replace("'", """")
Dim jsonObj = JsonConvert.DeserializeObject(jsonStr)
Dim summary As String = jsonObj("summary")
' Converting the summary to the desired format using the function above.
Dim operationId As String = GetOperationIdFromSummary(summary)
jsonObj("operationId") = operationId
Dim newJsonStr As String = JsonConvert.SerializeObject(jsonObj)
Console.WriteLine(newJsonStr)
Console.ReadLine()
End Sub
如上所述,我建议使用JSON库,但如果你想要一个只有Regex的解决方案,你可以使用这样的东西:
Dim jsonStr As String = '...
Dim newJsonStr As String =
Regex.Replace(jsonStr, "operationId"":\s*""(.+?)"".+summary"":\s*""(.+?)""",
Function(m)
Dim index As Integer = m.Groups(1).Index - m.Index
Dim length As Integer = m.Groups(1).Length
Dim summary As String = m.Groups(2).Value
Dim operationId As String = GetOperationIdFromSummary(summary)
Return m.Value.Remove(index, length).Insert(index, operationId)
End Function, RegexOptions.Singleline)
这里也是online example。
希望有所帮助。