正则表达式是非常强大的,但它们的语法可能是相当不透明的。今天我们将使用regex来捕获两个字符之间的所有内容。
问题设置示例
假设我们有以下字符串。
"你好,我叫[姓名],我是[年龄]岁,我在[职业]领域工作"。
而我们希望最终得到以下数组。
['name', 'age', 'profession'];
我们怎样才能做到这一点呢?
使用字符串.匹配方法
首先,我们要使用JavaScript的Stringmatch 方法,它需要一个字符串或正则表达式作为参数。
const str =
'Hi there, my name is [name], I am [age] years old, and I work in the field of [profession].';
const matches = str.match(/some regex here/);
懒惰地在大括号之间捕获
我们要在大括号之间进行捕捉。我们的第一次尝试可能包括一个正则表达式,看起来像这样:/\[.+?\]/g 。如果我们使用这个,我们会得到以下结果。
const str =
'Hi there, my name is [name], I am [age] years old, and I work in the field of [profession].';
const matches = str.match(/\[.+?\]/g);
console.log(matches);
// ["[name]", "[age]", "[profession]"]
很接近了但是我们不希望在我们的最终字符串中包含括号。
在我们努力消除它们之前,让我们评估一下我们在当前正则表达式中的做法。
外围部分/ /g 基本上说明了几件事:正斜杠表示这是一个正则表达式,g 表示这应该是一个全局正则表达式(即,我们不希望在第一个匹配处停止)。
接下来,\[ 和\] 意味着我们要匹配开头和结尾的括号,但我们必须使用反斜线来转义,因为括号本身在重合搜索的世界里还有其他用途。
最后,我们有.+? 。这意味着我们要捕获任何数量的字符*,直到我们遇到下一个] 。+? 是懒惰的*(捕获最小的数量,直到下一个括号),而你可能也熟悉只有+ ,这将捕获从第一个开口括号一直到最后一个结束括号!
移除括号
为了去除括号,我们可以使用lookahead和lookbehind操作符。我们可以说我们想在后面寻找开头的括号,在前面寻找结尾的括号,而不是匹配括号,但实际上不包括它们。
新的正则表达式与我们的lookahead和lookbehind操作符如下所示。
const str =
'Hi there, my name is [name], I am [age] years old, and I work in the field of [profession].';
const matches = str.match(/(?<=\[).+?(?=\])/g);
console.log(matches);
// ["name", "age", "profession"]
同样,我们在后面寻找开头的括号(?<=\[) ,我们在前面寻找结尾的括号(?=\]) 。