您好我需要为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+)?.+\((.+)?\).+/
。但它并不符合我的预期,请帮我解决。
答案 0 :(得分:1)
对于示例数据,您可以使用以下方式匹配您的值:
\s*(.+?)\s*=\s*.+\(([\s\S]*?)\)
那将匹配:
\s*
匹配空格字符的零次或多次(.+?)
在群组中捕获任何字符零次或多次非贪婪\s*
匹配空格字符的零次或多次=
按字面意思匹配\s*.+
匹配空格字符的零次或多次,后跟任意字符一次或多次\(([\s\S]*?)\)
在组中的括号内捕获任何非贪婪的字符答案 1 :(得分:1)
你的正则表达式受到贪婪的困扰(所有点星消耗到最后一行然后导致回溯)。在有机会的情况下,您最好寻找限制性模式:
(\S+)\s*=\s*[^(]*\(([^)]*)\)
\S
匹配非空白字符\s
这与\S
[^(]*
匹配除开括号之外的任何内容(可选)[^)]*
匹配除右括号之外的任何内容(可选)