Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用正则表达式从字符串中提取特定字符_Javascript_Regex - Fatal编程技术网

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

Javascript 使用正则表达式从字符串中提取特定字符,javascript,regex,Javascript,Regex,我需要拆分一个电子邮件地址,去掉第一个字符和@后面的第一个字符 我可以这样做: 'bar@foo'.split('@').map(function(a){ return a.charAt(0); }).join('') --> bf 现在我想知道是否可以使用正则表达式匹配来完成,比如 'bar@foo'.match(/^(\w).*?@(\w)/).join('') --> bar@fbf 不是我想要的,但我肯定我错过了一些东西!有什么建议吗?如果我理解正确的话,你很接近了。只需

我需要拆分一个电子邮件地址,去掉第一个字符和@后面的第一个字符

我可以这样做:

'bar@foo'.split('@').map(function(a){ return a.charAt(0); }).join('')
--> bf
现在我想知道是否可以使用正则表达式匹配来完成,比如

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

不是我想要的,但我肯定我错过了一些东西!有什么建议吗?

如果我理解正确的话,你很接近了。只需不加入
match
返回的所有内容,因为第一个元素是整个匹配的字符串

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

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

var addr = 'foo@bar';
console.log(addr[0], addr[addr.indexOf('@')+1])
为了确保您的代码在所有浏览器上都工作,您可能希望使用
charAt
而不是
[]

console.log(addr.charAt(0), addr.charAt(addr.indexOf('@')+1));
无论哪种方式,它都能正常工作,而且
如果要持久化并选择正则表达式,则应该意识到
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(“”)
可能就是您想要的。

使用正则表达式:

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

console.log(matched);
// ax

regex
match
函数返回所有匹配项的数组,其中第一个是匹配项的“全文”,后面是每个子组。在您的情况下,它将返回以下内容:

bar@f
b
f
要删除第一项(完全匹配项),请使用
slice

'bar@foo'.match(/^(\w).*?@(\w)/).slice(1).join('\r')
或者使用正则表达式

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

与以下部件一起使用:


我想知道这是否会更快。为什么要使用正则表达式?@Oliboy50:。Regex比OP发布的初始代码要快,但仍然远没有我的代码快suggestion@EliasVanOotegem我的建议会更快:。@VisioN:我看到了你的答案,将其添加到jsperf中:它比regex match版本快,但速度远不及我的suggestion@VisioN:很明显,那会是个问题,但是,这里列出的备选方案会默默地失败,因为它们会返回2个字符以外的其他字符。这种模式对OP没有什么用处。这是一种不充分的电子邮件验证模式,而不是从邮件中获取特定字符的模式string@EliasVan Ootegem上述模式正是需要的。是的,它会验证一封电子邮件,但它也会从电子邮件地址的两部分提取第一个字符。但是为什么OP会使用这种过于复杂的模式呢?他使用的模式返回(接近)相同的匹配。唯一的区别是,在调用
join
@Elias Van Ootegem之前,他需要
s[p]lice
结果数组。好吧,OP要求一个正则表达式:)但是,是的,模式本身可能不太复杂。
'bar@foo'.replace(/^(\w).*@(\w).*$/, '$1$2');  // "bf"