在RegExp中处理不同的匹配项

时间:2017-07-03 16:40:02

标签: javascript regex

我想构建一个RegExp,它匹配第一个单词的第一个字母或非首字母的第一个字母,但我想能够区分这两种匹配,所以我可以处理非首字匹配不同。

例如,我希望始终将第一个单词和除“bam”不是第一个单词的实例之外的所有其他单词大写。

我该怎么做?

function titleCase(title) {
    return title.replace(/\b(.)/g, (str, p1) => {         
         return p1.toUpperCase();
    });
}

titleCase('foo bar bam'); // Foo Bar Bam - but I want Foo Bar bam

2 个答案:

答案 0 :(得分:2)

您可以将多个正则表达式拼凑在一起,例如/(option 1)|(option 2)/g

然后你的回调将收到以下任何一个:

callback(match, option1, undefined, offset, subject) // left side matched
callback(match, undefined, option2, offset, subject) // right side matched

使用此功能,您的回调可能如下所示:

(str, p1, p2) => {
    if( p1) ...
    else if( p2) ...
}

答案 1 :(得分:1)

这是titleCase的一个实现,它将大写字符串中每个类似字的元素的第一个字母。

function titleCase(title) {
  return title.replace(/\b(\w)(.*?)\b/g, (match, g1, g2) => `${g1.toUpperCase()}${g2}`)
}
  1. 在此示例中,/\b(\w)(.*?)\b/g将匹配单词边界(\b),后跟单词字符(\w)。我们使用分组(\w)捕获第一个字母,并在替换函数中用作g1
  2. 然后我们使用组(.*?)捕获单词的剩余部分,该组在替换器中使用g2引用。
  3. 最后,模板字符串用于大写第一个字母组,并将结果与​​单词的剩余匹配连接起来。