此正则表达式方言不支持条件

Posted

技术标签:

【中文标题】此正则表达式方言不支持条件【英文标题】:Conditionals are not supported in this regex dialect 【发布时间】:2021-09-15 14:23:15 【问题描述】:

在我的打字稿文件中,我想使用包含条件表达式的正则表达式,但我的 IDE 强调了带有条件表达式报告的 RegEx 部分:“”。如何启用支持条件正则表达式的方言?

export const phoneRegEx = /^\+?\d*\s?\(?(?(?<=\()\d+\)\s?\d+(-|\s|\.)?(?:\1?\d)*|(\.|\s|-)?(\2?\d)*)$/g;

我的 package.json 文件:


    "private": true,
    "scripts": 
        "dev": "npm run development",
        "development": "mix",
        "watch": "mix watch",
        "watch-poll": "mix watch -- --watch-options-poll=1000",
        "hot": "mix watch --hot",
        "prod": "npm run production",
        "production": "mix --production"
    ,
    "devDependencies": 
        "@babel/preset-react": "^7.13.13",
        "@tsconfig/create-react-app": "^1.0.2",
        "@types/js-cookie": "^2.2.6",
        "@types/react-router-dom": "^5.1.7",
        "@typescript-eslint/eslint-plugin": "^4.26.1",
        "@typescript-eslint/parser": "^4.26.1",
        "axios": "^0.21",
        "eslint": "^7.28.0",
        "eslint-plugin-react": "^7.24.0",
        "eslint-plugin-react-hooks": "^4.2.0",
        "file-loader": "^6.2.0",
        "laravel-mix": "^6.0.6",
        "lodash": "^4.17.19",
        "postcss": "^8.1.14",
        "ts-loader": "^9.2.3",
        "typescript": "^4.3.2"
    ,
    "dependencies": 
        "@hookform/resolvers": "^2.5.2",
        "@material-ui/core": "^4.11.4",
        "@material-ui/icons": "^4.11.2",
        "js-cookie": "^2.2.1",
        "react-hook-form": "^7.8.3",
        "react-paginate": "^7.1.3",
        "react-router-dom": "^5.2.0",
        "yup": "^0.32.9"
    

我的 tsconfig.json 文件:


    "extends": "@tsconfig/create-react-app/tsconfig.json",
    "compilerOptions": 
//        "module": "CommonJS",
        "target": "ES2020",
        "sourceMap": true,
        "jsx": "react",
        "noEmit": false
    ,
    "exclude": ["node_modules"],
    "include": ["resources", "index.d.ts"]

我的 .eslintrc.json 文件:


    "env": 
        "browser": true,
        "es2020": true
    ,
    "extends": [
        "eslint:recommended",
        "plugin:react/recommended",
        "plugin:@typescript-eslint/recommended"
    ],
    "parser": "@typescript-eslint/parser",
    "parserOptions": 
        "ecmaFeatures": 
            "jsx": true
        ,
        "ecmaVersion": 2020,
        "sourceType": "module",
        "project": "./tsconfig.json"
//        "tsconfigRootDir": "./resources"
    ,
    "plugins": [
        "react",
        "@typescript-eslint",
        "react-hooks"
    ],
    "rules": 
        "react-hooks/rules-of-hooks": "error",
        "react-hooks/exhaustive-deps": "warn"
    

【问题讨论】:

你可以去掉条件并使用/^\+?\d*\s?(?:\(\d+\)\s?\d+([-\s.]?)(?:\1?\d)*|([.\s-]?)(?:\2?\d)*)$/g @WiktorStribiżew 哇,它有效,很酷的解决方法 【参考方案1】:

问题在于 javascript 正则表达式不支持条件构造,请参阅您的正则表达式中的 (?(?&lt;=\()...|...)。这意味着只有在第一个选项之前有一个 ( 字符时才会匹配第一个选项,否则将尝试第二个选项。

我建议通过将\( 模式移动到后续组的第一个替代模式来完全摆脱条件(同时从模式中删除? 使其成为强制性):

/^\+?\d*\s?(?:\(\d+\)\s?\d+([-\s.]?)(?:\1?\d)*|([.\s-]?)(?:\2?\d)*)$/g
//            ^^

请参阅regex demo。 详情

^ - 字符串开头 \+? - 一个可选的+ \d* - 零个或多个数字 \s? - 可选空格 (?: - 非捕获组的开始: \(\d+\) - (,一位或多位数字,) \s? - 可选空格 \d+ - 一位或多位数字 ([-\s.]?) - 第 1 组:可选的 -、空格或 . (?:\1?\d)* - 可选的 Group 1 值出现零次或多次,后跟任意一位数字 | - 或 ([.\s-]?) - 第 2 组:可选的 -、空格或 . (?:\2?\d)* - 可选的第 2 组值出现零次或多次,后跟任意一位数字 ) - 小组结束 $ - 字符串结束。

【讨论】:

以上是关于此正则表达式方言不支持条件的主要内容,如果未能解决你的问题,请参考以下文章

Shell编程-正则表达式

Grep家族和正则表达式详解

正则表达式与Linux通配符

[Shell]正则表达式与通配符

shell编程

第10章 Shell编程_正则表达式