如何使用正则表达式选择整个import语句?



我正在用Python编写一个静态代码分析工具。

下面是需要分析的代码示例:

import {
component$,
useClientEffect$,
} from '@builder.io/qwik'
import Swiper from 'swiper'
import {
Navigation,
Pagination
} from 'swiper'
import { Image } from 'Base'
import Button from '../Shared/Button'
import Heading from '../Shared/Heading'
const Portfolio = component$(
(
{
items,
title,
linkText,
link
}
) => {

我必须检查的一项是确保在最后一次导入之后有一个空行。正如您在上面的示例中看到的,作为组件声明的const Portfolio被附加到前面的导入中。我需要确保它前面有一个空行。

我尝试了(?<=import).*(?=from),但它不起作用。请注意,开发人员可能会在两个导入之前放置空行。或者,他可能在输入前放置空白。换句话说,开发人员可能会写出最不格式化的代码。

我可以使用什么正则表达式来确保这个要求?

这是我目前想到的解决方案:

"(^[sn]{0,}import.*from[^a-zA-Z0-9]+[ ./a-zA-Z0-9']+$)|(^[s]{0,}import.*(n +.*|s)*.*from[^a-zA-Z0-9]+[ ./a-zA-Z'0-9]+$)"mg

有两组:

  • (^[sn]{0,}import.*from[^a-zA-Z0-9]+[ ./a-zA-Z0-9']+$)
    • ^[sn]{0,}import—一行以import开头. 在这个单词之前,我们可以遇到(或者根本没有)空格,新行。
    • import.*from之间的文字import我们可以满足任何
    • from[^a-zA-Z0-9]+[ ./a-zA-Z0-9']+$-字来自后面跟着非字母&非数字符号([^a-zA-Z0-9]+)或字母/数字/单引号/点/空格([ ./a-zA-Z0-9']+)。
  • (^[s]{0,}import.*(n +.*|s)*.*from[^a-zA-Z0-9]+[ ./a-zA-Z'0-9]+$)
    • ^[s]{0,}import-一行以import开头. 在这个单词之前,我们可以遇到(或者根本没有)一些空格。
    • import.*(n +.*|s)*.*from-在import之间和我们可以满足任何多行文本(这就是为什么我们需要标记m- multiline)
    • from[^a-zA-Z0-9]+[ ./a-zA-Z0-9']+$-与第一组含义相同

regex101.com

最新更新