javascript - Betingelser støttes ikke i denne regex-dialekten


I TypeScript-filen min vil jeg bruke et regulært uttrykk som inkluderer betinget uttrykk, men IDE-en min understreker delen av RegEx med betinget uttrykk og rapporterer: "Betingelser støttes ikke i denne regex-dialekten". Hvordan kan jeg aktivere en dialekt som støtter betingede regulære uttrykk?

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

min package.json-fil:

{
    "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"
    }
}

min tsconfig.json-fil:

{
    "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"]
}

min .eslintrc.json-fil:

{
    "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"
    }
}

Svar #1

Problemet er at JavaScript-regex ikke støtter betingede konstruksjoner, se (?(?<=\()...|...) i regexen din. Det betyr at det første alternativet bare vil bli matchet hvis det er en ( -tegn rett foran det, ellers vil det andre alternativet bli prøvd.

Jeg foreslår å kvitte seg helt med betingelsen ved å flytte \(-mønsteret til det første alternativet i den påfølgende gruppen (mens du fjerner ? fra mønsteret for å gjøre det obligatorisk):

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

Se regex-demoen. Detaljer:

  • ^ - starten på strengen
  • \+? - en valgfri +
  • \d* - null eller flere sifre
  • \s? - et valgfritt mellomrom
  • (?: - start på en ikke-fangende gruppe:

    • \(\d+\) - (, ett eller flere sifre, )
    • \s? - et valgfritt mellomrom
    • \d+ - ett eller flere sifre
    • ([-\s.]?) - Gruppe 1: en valgfri -, mellomrom eller .
    • (?:\1?\d)* - null eller flere forekomster av den valgfrie Gruppe 1-verdien fulgt av et hvilket som helst enkelt siffer
    • | - eller
    • ([.\s-]?) - Gruppe 2: en valgfri -, mellomrom eller .
    • (?:\2?\d)* - null eller flere forekomster av den valgfrie Gruppe 2-verdien fulgt av et hvilket som helst enkelt siffer
  • ) - slutten på gruppen
  • $ - slutten av strengen.

Relaterte artikler