我有以下代码:
string STR = "AA ABC AA AA ABC aa aa aa AA" ; //declare string
Regex rx = new Regex(@"AA"); // declare regular expression
MatchCollection matches = rx.Matches(STR); // find matches in STR
foreach (Match match in matches)
{
// perform sub-string operations that changes the original string
STR = "AA AA ABC aa aa aa AA" // substring operation which arbitrary changes the string
matches = rx.Matches(STR); // perform matching operation again
// because original string is changed
// ERROR : 'matches' in for loop is not changed (?)
// Question: how can I change 'matches' in for loop, thus it will start
// to work in new modified string ?
}
有人可以帮我解决上述问题吗?
编辑:
int j = 15
for (int i = 0 to j){
// change both i and j value arbitrarily
i = 100
j = 102
changes is reflected in original for loop
}
在第一种情况下,我希望改变反思。但是,'匹配'的更改不会反映在foreach循环中。这就是问题。怎么解决?
答案 0 :(得分:1)
您正在枚举matches
,因此如果您更改matches
,则您正在更改枚举,而您正在枚举它。当然这不起作用,您需要一个新变量来保存更改后的matches
。
答案 1 :(得分:0)
您不应修改当前正在迭代的对象:首先创建原始对象的副本,然后将更改应用于副本。
答案 2 :(得分:0)
只需为Matches
使用两个变量即可。 1用于每个循环..另一个根据您的意愿修改。或者使用带有计数器的基本循环。您无法修改主动使用的集合(foreach循环)。
答案 3 :(得分:0)
我仍然不确定你想要达到的目标,但我认为递归可能对你有所帮助。这样你的循环体将在所有原始匹配上运行,如果字符串改变,它也将在所有新匹配上运行。但请注意无限递归。
void ForEach(Regex rx, string str)
{
foreach (Match match in rx.Matches(str))
{
// code that might change str
// if(the str was changed)
ForEach(rx, str);
}
}