前端杂谈 · Web

Javascrip 正则表达式速查表

•̀.̫•́✧ · 5月6日 · 2020年本文5529字 · 阅读14分钟214

正则表达式 「regex」 ,用于在一个字符串中匹配部分内容。下面是我整理出来的创建和使用正则表达式速查表。

测试正则表达式

使用 .test() 方法

let testString = "My test string"; // 声明字符串变量
let testRegex = /string/;  //声明正则表达式变量,这种形式代表是 regex
testRegex.test(testString); //由于含 "string" ,返回 true

测试多模式中任意一个存在

使用  操作符 (|

const regex = /yes|no|maybe/;

忽略大小写

使用 i 开关标志表示大小写不敏感

const caseInsensitiveRegex = /ignore case/i; //注意最后的 i
const testString = 'We use the i flag to iGnOrE CasE';
caseInsensitiveRegex.test(testString); // 由于字符串中的 "iGnOrE CasE" 在忽略大小写的情况下与 “ignore case” 相同,故命中返回 true

从字符串中抽出第一个匹配项

使用 .match() 函数

const match = "Hello World!".match(/hello/i); // 常量 match = "Hello"

从字符串中抽出所有匹配项到一个数组中

使用 g 开关标志

const testString = "Repeat repeat rePeAT";
const regexWithAllMatches = /Repeat/gi; //最后的 g 表示全部。
testString.match(regexWithAllMatches); // 返回 ["Repeat", "repeat", "rePeAT"]

匹配任意的一个字符

使用通配符 . 表示一个字符的占位,可匹配任何字符

// 匹配 "cat", "BAT", "fAT", "mat" -所有都是一个字符后跟 "at"
const regexWithWildcard = /.at/gi; //全部,忽略大小写
const testString = "cat BAT cupcake fAT mat dog";
const allMatchingWords = testString.match(regexWithWildcard); // ["cat", "BAT", "fAT", "mat"]

一个字符位置上可能出现字符集合的匹配

  • 使用字符类表达式,它可以定义一个字符集合匹配字符串中指定的字符位
  • 将字符集合放到 [] 中
// 匹配  "cat" "fat" 和 "mat" ,但是不匹配 "bat"
const regexWithCharClass = /[cfm]at/g; //[]中的任意一个字符出现即匹配
const testString = "cat fat bat mat";
const allMatchingWords = testString.match(regexWithCharClass); // ["cat", "fat", "mat"]

匹配字母表中的字母

使用字符集连续范围表示符 -,如  [a-z]

const regexWithCharRange = /[a-e]at/;
const catString = "cat";
const batString = "bat";
const fatString = "fat";

regexWithCharRange.test(catString); // true
regexWithCharRange.test(batString); // true
regexWithCharRange.test(fatString); // false

匹配字母和数字

连字符 - 也可用于数字

const regexWithLetterAndNumberRange = /[a-z0-9]/ig;
const testString = "Emma19382";
testString.match(regexWithLetterAndNumberRange) // 全匹配,返回原始串 "Emma19382"

匹配一个未知字符(排除已知字符)

  • 匹配不想要的字符集合,可以使用 否定表示符 表示排除的字符集合
  • 使用脱字符 ^ 表示排除字符集
const allCharsNotVowels = /[^aeiou]/gi;
const allCharsNotVowelsOrNumbers = /[^aeiou0-9]/gi;

匹配字符出现一次或多次

字符后使用  +  符号

const oneOrMoreAsRegex = /a+/gi;
const oneOrMoreSsRegex = /s+/gi;
const cityInFlorida = "Tallahassee";

cityInFlorida.match(oneOrMoreAsRegex); // ['a', 'a', 'a'];
cityInFlorida.match(oneOrMoreSsRegex); // ['ss'];

匹配字符出现 0 次或多次

使用星号 *

const zeroOrMoreOsRegex = /hi*/gi;
const normalHi = "hi";
const happyHi = "hiiiiii";
const twoHis = "hiihii";
const bye = "bye";

normalHi.match(zeroOrMoreOsRegex); // ["hi"]
happyHi.match(zeroOrMoreOsRegex); // ["hiiiiii"]
twoHis.match(zeroOrMoreOsRegex); // ["hii", "hii"]
bye.match(zeroOrMoreOsRegex); // null

惰性匹配

  • 只匹配尽量小的部分出来
  • 正则表达式中的 * 表示零次或多次,默认是贪心算法(匹配尽量多的字符、尽量大的部分出来)
  • 其后使用 ? 指示进行 惰性匹配 (匹配尽量少的字符、尽量小的部分出来)
const testString = "catastrophe";
const greedyRexex = /c[a-z]*t/gi;
const lazyRegex = /c[a-z]*?t/gi;

testString.match(greedyRexex); // ["catast"],其中 [a-z]* 匹配了 "atas"
testString.match(lazyRegex); // ["cat"],其中 [a-z]*? 仅匹配了 "a"

匹配字符串行首

匹配计算从字符串行首开始,使用脱字符 ^,这种情况,脱字符 ^ 不在字符集表示符 [] 里,与排除字符集语法 [^abc] 区分。

const emmaAtFrontOfString = "Emma likes cats a lot.";
const emmaNotAtFrontOfString = "The cats Emma likes are fluffy.";
const startingStringRegex = /^Emma/; //匹配行首是 "Emma"

startingStringRegex.test(emmaAtFrontOfString); // true
startingStringRegex.test(emmaNotAtFrontOfString); // false

匹配字符串行尾

匹配计算检查在字符串行尾,使用美元符 $。 

const emmaAtBackOfString = "The cats do not like Emma";
const emmaNotAtBackOfString = "Emma loves the cats";
const startingStringRegex = /Emma$/; //匹配以 "Emma" 结尾的字符串

startingStringRegex.test(emmaAtBackOfString); // true
startingStringRegex.test(emmaNotAtBackOfString); // false

匹配所有的字母和数字

使用 \word 的简写 \w

const longHand = /[A-Za-z0-9_]+/; //代表所有字母和数字的正则的长写法
const shortHand = /\w+/; //代表所有字母和数字的正则的短写法
const numbers = "42";
const myFavoriteColor = "magenta";

longHand.test(numbers); // true
shortHand.test(numbers); // true
longHand.test(myFavoriteColor); // true
shortHand.test(myFavoriteColor); // true
//字母和数字都匹配

匹配字母和数字之外的任何字符(排除字母和数字)

可使用 字母和数字 短写的反面,将 \w 中的 w 改成大写 \W,表示 \w 的反,即排除字母和数字

const noAlphaNumericCharRegex = /\W/gi;
const weirdCharacters = "!_$!!";
const alphaNumericCharacters = "ab283AD";

noAlphaNumericCharRegex.test(weirdCharacters); // true
noAlphaNumericCharRegex.test(alphaNumericCharacters); // false

匹配数字

可使用集合符 [0-9] 表示,也可用简写 \d 的形式表示匹配数字

const digitsRegex = /\d/g;
const stringWithDigits = "My cat eats $20.00 worth of food a week.";

stringWithDigits.match(digitsRegex); // ["2", "0", "0", "0"]

匹配数字之外的字符

使用大写的 \D 表示非 \d,匹配不是数字的字符

const nonDigitsRegex = /\D/g;
const stringWithLetters = "101 degrees";

stringWithLetters.match(nonDigitsRegex); // [" ", "d", "e", "g", "r", "e", "e", "s"]

匹配空白字符(空格、回车)

使用 \s 代表空格和回车换行

const sentenceWithWhitespace = "I like cats!"
var spaceRegex = /\s/g;
whiteSpace.match(sentenceWithWhitespace); // [" ", " "]

匹配非空白符

大写形式的 \S 表示 \s 的否定,非空白符

const sentenceWithWhitespace = "C a t"
const nonWhiteSpaceRegex = /\D/g;
sentenceWithWhitespace.match(nonWhiteSpaceRegex); // ["C", "a", "t"]

字符匹配次数指定

可指定匹配字符的匹配次数范围,形式为 {下限, 上限}

const regularHi = "hi";
const mediocreHi = "hiii";
const superExcitedHey = "heeeeyyyyy!!!";
const excitedRegex = /hi{1,4}/; // i 紧接在 h 后出现1到4次都匹配

excitedRegex.test(regularHi); // true
excitedRegex.test(mediocreHi); // true
excitedRegex.test(superExcitedHey); //false

字符匹配次数仅下限指定

  • 只指定次数指定形式中的下限,如 {下限}
  • 这常被称为数量指示
const regularHi = "hi";
const mediocreHi = "hiii";
const superExcitedHey = "heeeeyyyyy!!!";
const excitedRegex = /hi{2,}/; // i 紧接在 h 后2次即匹配(可多不能少)

excitedRegex.test(regularHi); // false
excitedRegex.test(mediocreHi); // true
excitedRegex.test(superExcitedHey); //false

匹配准确的出现次数

使用一个数的形式 {次数} 表示准确的出现次数

const regularHi = "hi";
const bestHi = "hii";
const mediocreHi = "hiii";
const excitedRegex = /hi{2}/; // 表示仅 i 在 h 后出现2次匹配

excitedRegex.test(regularHi); // false
excitedRegex.test(bestHi); // true
excitedRegex.test(mediocreHi); //false

有或没有都匹配

使用 ? 表示匹配其前面的字符,若没有前面字符也匹配。但是,若前面不是指定字符,不匹配

const britishSpelling = "colour";
const americanSpelling = "Color";
const languageRegex = /colou?r/i;

languageRegex.test(britishSpelling); // true
languageRegex.test(americanSpelling); // true

参考文献

https://dev.to/emmabostian/regex-cheat-sheet-2j2a

0 条回应