正则表达式

To the book page

Regexp golf

注意这里如果写对的话,应该什么都不会输出。

正则表达式中的\b是单词边界的标志,它用来匹配一个单词的边界。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
// Fill in the regular expressions

// 正则表达式应该匹配“car”和“cat”,但不匹配其他字符串。
verify(/ca[rt]/,
["my car", "bad cats"],
["camper", "high art"]);
// 正则表达式应该匹配“pop”和“prop”,但不匹配其他字符串。
verify(/pr?op/,
["pop culture", "mad props"],
["plop", "prrrop"]);
// 正则表达式应该匹配“ferret”,“ferry”和“ferrari”,但不匹配其他字符串。
verify(/ferr(et|y|ari)/,
["ferret", "ferry", "ferrari"],
["ferrum", "transfer A"]);
// 正则表达式应该匹配以“ious”结尾的任何单词。
verify(/\b\w*ious\b/,
["how delicious", "spacious room"],
["ruinous", "consciousness"]);
// 正则表达式应该匹配空白字符后跟一个句号、逗号、冒号或分号。
verify(/\s[.,;:]/,
["bad punctuation ."],
["escape the period"]);
// 正则表达式应该匹配长度大于六个字母的单词。
verify(/\b\w{7,}\b/,
["Siebentausenddreihundertzweiundzwanzig"],
["no", "three small words"]);
// 正则表达式应该匹配不包含字母“e”或“E”的单词。
verify(/\b[a-df-zA-DF-Z]+\b/,
["red platypus", "wobbling nest"],
["earth bed", "bedrøvet abe", "BEET"]);


function verify(regexp, yes, no) {
// Ignore unfinished exercises
if (regexp.source == "...") return;
for (let str of yes) if (!regexp.test(str)) {
console.log(`Failure to match '${str}'`);
}
for (let str of no) if (regexp.test(str)) {
console.log(`Unexpected match for '${str}'`);
}
}

Quoting style

将句子中的单引号换成双引号,但是单词缩写不能变,比如“aren’t”

这里调试了半天,因为我错误的将|写成中文的了。。。

  • (^|\W):匹配开头或非字母字符后面的单引号。
  • (\W|$):匹配单引号后面紧跟非字母字符或字符串结尾。
1
2
3
4
let text = "'I'm the cook,' he said, 'it's my job.'";
// Change this call.
console.log(text.replace(/(^|\W)'|'(\W|$)/g,'$1"$2'));
// → "I'm the cook," he said, "it's my job."

Numbers again

为了编写一个匹配JavaScript风格数字的正则表达式,我们需要支持以下特性:

  • 可选的正负号
  • 可选的十进制点
  • 指数表示法(e或E),以及可选的正负号

以下是我们可以遵循的步骤:

  1. 可选的正负号[+-]?
  2. 整数和小数部分
    • 整数部分:\d*
    • 小数部分:\.\d+
  3. 指数部分e[+-]?\d+

将这些部分组合在一起,我们得到一个正则表达式来匹配JavaScript风格的数字:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
let number = /^[+-]?(\d+(\.\d*)?|\.\d+)([eE][+-]?\d+)?$/;

// Tests:
for (let str of ["1", "-1", "+15", "1.55", ".5", "5.",
"1.3e2", "1E-4", "1e+12"]) {
if (!number.test(str)) {
console.log(`Failed to match '${str}'`);
}
}
for (let str of ["1a", "+-1", "1.2.3", "1+1", "1e4.5",
".5.", "1f5", "."]) {
if (number.test(str)) {
console.log(`Incorrectly accepted '${str}'`);
}
}

解释

  • ^[+-]?:匹配开头的可选正负号。
  • (\d+(\.\d*)?|\.\d+):匹配整数或小数部分。
    • \d+(\.\d*)?:匹配整数部分,后面跟着可选的小数部分。例如,123123.456
    • |\.\d+:或者匹配只有小数点和小数部分。例如,.456
  • ([eE][+-]?\d+)?:匹配可选的指数部分。
    • [eE]:匹配eE
    • [+-]?:匹配可选的正负号。
    • \d+:匹配一或多个数字。
  • $:匹配字符串的结尾。