使用RegExp提取特定的字符串

时间:2018-08-10 08:01:14

标签: javascript regex

我有一个类似这样的字符串,

Example 1 @abc@xy<a href="http://-example.com">-example.com</a> and @xyz@abc.com Example 2

现在,我想删除在遇到第二个@之后出现的字符串,即@example.com @abc.com,并保留看起来应该是的其余数据

  

示例1 @abc和@xyz示例2

我尝试了很多RegExp,并看到了很多示例,但到目前为止还没有运气。

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

4 个答案:

答案 0 :(得分:1)

对于样本的后半部分,您可以简单地将两个@进行匹配,并通过分组并在替换中使用它们来仅替换第二个。

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

这将匹配一个@,后跟空格和@,然后将其存储在组1中。然后,它匹配下一个@,再匹配除了空格和@的任何其他东西。

如果两个@之间可能还有其他内容,则可以调整模式以将(@[^@]*)用于捕获组。

在样本的第一部分中,您必须找到一个更好的模式来匹配第二个@之后的内容,这可能与@[^\s@<]*(?:<[^<>]*>[^<>]*<\/[^<>]*>)相似,但我不太确定您的要求和匹配方式标签总是很棘手。

答案 1 :(得分:0)

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

Demo

答案 2 :(得分:0)

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

(@[^@]+?)@[^ ]+?(?= )

结果:

Example 1 @abc and @xyz Example 2

https://regex101.com/r/mXRlsZ/1

请注意,这还会替换行中的所有@,超过第一个-例如@abc@xy@foo将变为@abc

答案 3 :(得分:0)

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);

说明

首先,从搜索@符号开始。变量x正在跟踪@的出现次数。一旦达到2,我们就会提取末尾和>之间的所有内容。如果x不等于2,那么我们只返回匹配项(m.Value);