Javascript 使用RegExp提取特定字符串

Javascript 使用RegExp提取特定字符串,javascript,regex,Javascript,Regex,我有一根这样的绳子 示例1@abc@xy及@xyz@abc.com例2 现在,我想删除在遇到第二个@之后出现的字符串,即@example.com@abc.com,并保留剩余的数据,这些数据应该如下所示: 示例1@abc和@xyz示例2 我已经尝试了很多RegExp,看到了很多例子,但到目前为止没有运气 如果有人尝试过类似的方法,如果你能帮助我,那就太好了。试试这个模式:^[^@]*@[^@]+(?=@)。它将匹配第二个@之前的所有内容。它锚定在字符串的开头,首先它匹配除@:[^@],然后匹配@

我有一根这样的绳子

示例1@abc@xy及@xyz@abc.com例2
现在,我想删除在遇到第二个
@
之后出现的字符串,即
@example.com
@abc.com
,并保留剩余的数据,这些数据应该如下所示:

示例1@abc和@xyz示例2

我已经尝试了很多RegExp,看到了很多例子,但到目前为止没有运气


如果有人尝试过类似的方法,如果你能帮助我,那就太好了。

试试这个模式:
^[^@]*@[^@]+(?=@)
。它将匹配第二个
@
之前的所有内容。它锚定在字符串的开头,首先它匹配除
@
[^@]
,然后匹配
@
,然后再次匹配除
@
[^@]
之外的所有内容,直到满足下一个
@
(?=@
(正向前瞻)


捕获组中的第一个
@
字符,后跟非
@
字符,然后再次匹配
@
字符,后跟非空格字符,并替换为第一个捕获的组:

(@[^@]+?)@[^ ]+?(?= )
结果:

Example 1 @abc and @xyz Example 2

请注意,这也将替换一行中超过第一个-eg
@abc@xy@foo
将成为
@abc

字符串输入=@“示例1@abc@xy及@xyz@abc.com例2”;
string input = @"Example 1 @abc@xy<a href=""http://-example.com"">-example.com</a> and @xyz@abc.com Example 2";
string pattern = @"@.+?(?=@|$)";
int x = 0;
string s = Regex.Replace(
    input,
    pattern,
    m => ++x == 2 ? Regex.Match(m.Value, @">(\s+.+?\s+)$").Groups[1].Value : m.Value);
字符串模式=@“@.+?(?=@|$)”; int x=0; 字符串s=Regex.Replace( 输入 图案 m=>++x==2?Regex.Match(m.Value,@“>(\s++?\s+$))。组[1]。值:m.Value);
解释
首先,从搜索
@
符号开始。变量
x
正在跟踪
@
的出现次数。一旦它达到2,我们就提取结尾和
之间的所有内容。如果
x
不等于2,那么我们只返回匹配(
m.Value

对于示例的后半部分,您可以简单地匹配两个
@
s,并通过分组并在替换中使用它们来仅替换第二个

模式:
/(@[^\s@]*)@[^\s@]*/g
替换:
“$1”

这将匹配后跟空格和@以外的任何字符的@,并将其存储在组1中。然后它匹配下一个@和除空格和@之外的任何内容

如果两个@s之间可能存在其他内容,您可以调整您的模式以使用捕获组的
(@[^@]*)


对于示例的第一部分,您必须找到更好的模式来匹配第二部分后面的内容@,这可能是
@[^\s@hey谢谢,但只有当我的字符串以一个
@
开头时它才起作用,但事实并非如此。第二个@之后出现的字符串-你对什么属于该字符串和什么不属于该字符串有一个清晰的定义吗?在你的示例中,它似乎是
@xy
-为什么不
@xy
或者
@xy和
嘿,
@xy
整个零件需要更换。
将被保留。
是否总是在第二个
@
的末尾?@shryahaha这将是
(@[^\s@*)@[^\s@]*
并替换为
$1
。您使用什么语言来实现此功能?您不需要所有这些非贪婪的量词和积极的前瞻:
(@[^@]+)@\s+
有效。非常感谢。