我需要使用正则表达式匹配*字符的第二次和后续出现。我实际上是使用Replace方法删除它们,所以这里有一些前后的例子:
test* -> test* (no change)
*test* -> *test
test** *e -> test* e
是否可以使用正则表达式执行此操作? 感谢
答案 0 :(得分:4)
如果.NET可以处理任意数量的外观,请尝试使用空字符串替换以下模式:
(?<=\*.*)\*
PS Home:\> 'test*','*test*','test** *e' -replace '(?<=\*.*)\*',''
test*
*test
test* e
另一种方式是这种模式:
(?<=\*.{0,100})\*
其中数字100
可以替换为目标字符串的大小。
使用Mono 2.0测试以下内容:
using System;
using System.Text.RegularExpressions;
public class Test
{
public static void Main()
{
Regex r = new Regex(@"(?<=\*.*)\*");
Console.WriteLine("{0}", r.Replace("test*", ""));
Console.WriteLine("{0}", r.Replace("*test*", ""));
Console.WriteLine("{0}", r.Replace("test** *e", ""));
}
}
还制作了:
test*
*test
test* e
答案 1 :(得分:0)
非最佳,但另一种方法。 记录第一个匹配项的索引,替换所有匹配项,并将第一个匹配项重新插入到recored index。
答案 2 :(得分:0)
$str =~ s/\*/MYSPECIAL/; #only replace the first *
$str =~ s/\*//g; #replace all *
$str =~ s/MYSPECIAL/\*/; #put * back