在Django模型类的多行表示中捕获字段名称

时间:2018-06-17 12:59:28

标签: javascript regex

您好我需要为vscode扩展编写一个正则表达式,它以字符串表示形式匹配该类的字段:

const str = `
  title = models.CharField(
      blank=True
  )    
  text = models.TextField() 
  author=ForeignKey(
      User,
      on_delete=models.CASCADE
  )
  test_num_10 = models.TextFIeld()
  `
从下面的多行字符串

我需要捕获字符串title, text, author, test_num_10 每个小组都遵循一种模式:

  • 白色空间
  • 捕捉群组,任何角色
  • 可选空格
  • =签名
  • 可选空格
  • 任何角色
  • (签名
  • 可选任何角色
  • )签名。

到目前为止,我的正则表达式看起来像/\s+(.+)(\s+)?\=(\s+)?.+\((.+)?\).+/。但它并不符合我的预期,请帮我解决。

2 个答案:

答案 0 :(得分:1)

对于示例数据,您可以使用以下方式匹配您的值:

\s*(.+?)\s*=\s*.+\(([\s\S]*?)\)

那将匹配:

  • \s*匹配空格字符的零次或多次
  • (.+?)在群组中捕获任何字符零次或多次非贪婪
  • \s*匹配空格字符的零次或多次
  • =按字面意思匹配
  • \s*.+匹配空格字符的零次或多次,后跟任意字符一次或多次
  • \(([\s\S]*?)\)在组中的括号内捕获任何非贪婪的字符

答案 1 :(得分:1)

你的正则表达式受到贪婪的困扰(所有点星消耗到最后一行然后导致回溯)。在有机会的情况下,您最好寻找限制性模式:

(\S+)\s*=\s*[^(]*\(([^)]*)\)
  • \S匹配非空白字符
  • \s这与\S
  • 相反
  • [^(]*匹配除开括号之外的任何内容(可选)
  • [^)]*匹配除右括号之外的任何内容(可选)

Live demo