使用正则表达式我尝试匹配一个字符串,该字符串具有由未知重复次数(一个或多个)组成的子字符串,然后用相同数量的替换字符串替换重复的子字符串。
如果Regexp是"(st)[a]+(ck)"
,那么我想得到这样的结果:
"stack" => "stOck"
"staaack" => "stOOOck" //so three times "a" to be replaced with three times "O"
"staaaaack" => "stOOOOOck"
我该怎么做?
C#或AS3都可以。
答案 0 :(得分:1)
如果您使用.net,则可以执行此操作
find: (?<=\bsta*)a(?=a*ck\b)
replace: o
如果您想要更改其他单词子串的所有sta + ck,只需删除\b
答案 1 :(得分:1)
由于我不熟悉C#或AS3,我将用JavaScript编写解决方案,但解决方案中的概念可用于C#代码或AS3代码。
var str = "stack stackoverflow staaaaaack stOackoverflow should not replace";
var replaced = str.replace(/st(a+)ck/g, function ($0, $1) {
var r = "";
for (var i = 0; i < $1.length; i++) {
r += "O";
}
return "st" + r + "ck";
});
输出:
"stOck stOckoverflow stOOOOOOck stOackoverflow should not replace"
在C#中,您可以使用Regex.Replace(String, String, MatchEvaluator)
(或其他Regex.Replace
方法接受MatchEvaluator
委托)来达到同样的效果。
在AS3中,您可以将函数作为替换函数传递,类似于我在JavaScript中的操作。查看String.replace()
方法的文档。
答案 2 :(得分:0)
为什么不使用String Replace()方法?
var str = "stack";
str = str.Replace("a", "O");
答案 3 :(得分:0)
我会这样做:
String s = "Staaack";
Console.WriteLine(s);
while (Regex.Match(s,"St[O]*([a]{1})[a]*ck").Success){
s = Regex.Replace(s,"(St[O]*)([a]{1})([a]*ck)", "$1O$3");
Console.WriteLine(s);
}
Console.WriteLine(s);
Console.ReadLine();
它会在每次迭代时替换一个a,直到找不到为止。
答案 4 :(得分:0)
对于AS3,您可以将function
传递给replace对象上的String
方法,其中匹配元素位于arguments
数组中。因此,您可以构建并返回一个新的String,其中所有'a'都替换为'O'
例如:
// first way explicit loop
var s:String="staaaack";
trace("before", s);
var newStr:String = s.replace(/(st)(a+)(ck)/g, function():String{
var ret:String=arguments[1]; // here match 'st'
//arguments[2] match 'aaa..'
for (var i:int=0, len:int=arguments[2].length; i < len; i++)
ret += "O";
return ret + arguments[3]; // arguments[3] match 'ck'
});
trace("after", newStr); // output stOOOOck
// second way array and join
var s1:String="staaaack staaaaaaaaaaaaack stack paaaack"
trace("before", s1)
var after:String = s1.replace(/(st)(a+)(ck)/g, function():String{
return arguments[1]+(new Array(arguments[2].length+1)).join("O")+arguments[3]
})
trace("after", after)
这里有关于wonderfl的实例:http://wonderfl.net/c/bOwE