正则表达式替换修改的捕获组

时间:2018-05-16 22:04:54

标签: regex vb.net

好的,你那里有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,因此可能有其他处理方式,但我想尽可能简洁地进行。

1 个答案:

答案 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

Try it online

如上所述,我建议使用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

希望有所帮助。