使用正则表达式从字符串中提取特定字符

时间:2014-06-25 08:41:25

标签: javascript regex

我需要拆分一个电子邮件地址并取出第一个字符和'@'

之后的第一个字符

我可以这样做:

'bar@foo'.split('@').map(function(a){ return a.charAt(0); }).join('')
--> bf

现在我想知道是否可以使用正则表达式匹配来完成,就像这样

'bar@foo'.match(/^(\w).*?@(\w)/).join('')
--> bar@fbf

不是我想要的,但我相信我会错过这里的一些东西!有什么建议吗?

6 个答案:

答案 0 :(得分:3)

如果我理解正确,你就很亲密了。只是不要join match返回的所有内容,因为第一个元素是整个匹配的字符串。

'bar@foo'.match(/^(\w).*?@(\w)/).splice(1).join('')
--> bf

答案 1 :(得分:3)

为什么要使用正则表达式?只需使用indexOf获取任何给定位置的char:

var addr = 'foo@bar';
console.log(addr[0], addr[addr.indexOf('@')+1])

为确保您的代码适用于所有浏览器,您可能希望使用charAt代替[]

console.log(addr.charAt(0), addr.charAt(addr.indexOf('@')+1));

无论哪种方式,它都会正常工作,This is undeniably the fastest approach
如果你 要继续,并选择一个正则表达式,那么你应该意识到match方法返回一个包含3个字符串的数组,在你的情况下:

/^(\w).*?@(\w)/
["the whole match",//start of string + first char + .*?@ + first string after @
 "groupw 1 \w",//first char
 "group 2 \w"//first char after @
]

所以addr.match(/^(\w).*?@(\w)/).slice(1).join('')可能就是你想要的。

答案 2 :(得分:1)

使用正则表达式:

matched="",
'abc@xyz'.replace(/(?:^|@)(\w)/g, function($0, $1) { matched += $1; return $0; });

console.log(matched);
// ax

答案 3 :(得分:1)

正则表达式match函数返回所有匹配的数组,其中第一个是匹配的“全文”,后跟每个子组。在您的情况下,它返回:

bar@f
b
f

要摆脱第一项(完整匹配),请使用slice

'bar@foo'.match(/^(\w).*?@(\w)/).slice(1).join('\r')

答案 4 :(得分:1)

String.prototype.replace使用regular expression

'bar@foo'.replace(/^(\w).*@(\w).*$/, '$1$2');  // "bf"

答案 5 :(得分:0)

或使用RegEx

^([a-zA-Z0-9])[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@([a-zA-Z0-9-])[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$

Fiddle