我有一个类似这样的字符串,
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,并看到了很多示例,但到目前为止还没有运气。
如果有人尝试过类似的尝试,那么如果您能帮助我,那就太好了。
答案 0 :(得分:1)
对于样本的后半部分,您可以简单地将两个@
进行匹配,并通过分组并在替换中使用它们来仅替换第二个。
模式:/(@[^\s@]*)@[^\s@]*/g
替换:'$1'
这将匹配一个@,后跟空格和@,然后将其存储在组1中。然后,它匹配下一个@,再匹配除了空格和@的任何其他东西。
如果两个@之间可能还有其他内容,则可以调整模式以将(@[^@]*)
用于捕获组。
在样本的第一部分中,您必须找到一个更好的模式来匹配第二个@之后的内容,这可能与@[^\s@<]*(?:<[^<>]*>[^<>]*<\/[^<>]*>)
相似,但我不太确定您的要求和匹配方式标签总是很棘手。
答案 1 :(得分:0)
尝试以下模式:^[^@]*@[^@]+(?=@)
。它将匹配第二个@
之前的所有内容。它锚定在字符串的开头,首先匹配除@
:[^@]
之外的所有内容,然后匹配@
,然后再次匹配除@
:[^@]
之外的所有内容,直到遇到下一个@
:(?=@)
(正向超前)。
答案 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
);