捕获第一个左大括号和第二个左括号之间的 graphql 数据键

Capturing graphql data key between the first opening curly bracket and the second opening parenthesis

我正在尝试编写正则表达式以重构 GraphQL 上的一些端到端测试 API。

以下是我想要捕获的一些示例:

query SignIn($payload: AuthCredentialsInput!) {
  signIn(payload: $payload) {
    token
  }
}

应该检索 signIn

mutation SendConfirmationEmail($athleteId: ID!) {
  sendConfirmationEmail(athleteId: $athleteId) {
    id
  }
}

应该检索 sendConfirmationEmail

mutation CreateProgram($title: String!) {
  createProgram(title: $title) {
    id
    title
  }
}

应该检索 createProgram

query GetAllExerciseTemplates {
  getAllExerciseTemplates {
    id
    title
  }
}

应该检索 getAllExerciseTemplates

目前我需要为每个端到端测试手动传递这些密钥。

我最好的尝试是这个正则表达式:.+?\{+[ \r\n\t\f\v ](.+)\(

    const regexTest = query.query.match(/.+?\{+[ \r\n\t\f\v ](.+)\(/)
    console.warn(regexTest)

但结果是这样的:

  console.warn
    [
      'mutation CreateProgram($title: String!) {\n          createProgram(',
      '          createProgram',
      index: 0,
      input: 'mutation CreateProgram($title: String!) {\n' +
        '          createProgram(title: $title) {\n' +
        '            id\n' +
        '            title\n' +
        '          }\n' +
        '        }',
      groups: undefined
    ]

这里有可以解决的正则表达式专家吗?

编辑:这是我做的最好的一张照片,但如果我能只有一个正则表达式而不是两个就更好了

function getDataKey(query: Query) {
  const keyBeforeFirstParenthesis = /.+?{[\r\n\t\f\v ]+(.+)\(/
  const keyBeforeFirstBracket = /.+?{[\r\n\t\f\v ]+(.+) {/

  let regExpMatchArray
  regExpMatchArray = query.query.match(keyBeforeFirstParenthesis)
  if (!regExpMatchArray)
    regExpMatchArray = query.query.match(keyBeforeFirstBracket)

  return regExpMatchArray[1]
}

您可以将两个正则表达式加入

/.+?{\s*(.+?)\s*[({]/

regex demo详情:

  • .+? - 除换行字符外的一个或多个字符尽可能少
  • { - 一个 { 字符
  • \s* - 零个或多个空格
  • (.+?) - 第 1 组:除换行字符外的一个或多个字符尽可能少
  • \s* - 零个或多个空格
  • [({] - ({ 字符。