Using Regex.Replace to keep characters that can be vary

故事扮演 提交于 2020-01-11 05:42:12

问题


I have the following:

string text = "version=\"1,0\"";

I want to replace the comma for a dot, while keeping the 1 and 0, BUT keeping in mind that they be different in different situations! It could be version="2,3" .

The smart ass and noob-unworking way to do it would be:

           for (int i = 0; i <= 9; i++)
            {
                for (int z = 0; z <= 9; z++)
                {
                    text = Regex.Replace(text, "version=\"i,z\"", "version=\"i.z\"");
                }
            }

But of course.. it's a string, and I dont want i and z be behave as a string in there.

I could also try the lame but working way:

text = Regex.Replace(text, "version=\"1,", "version=\"1.");
text = Regex.Replace(text, "version=\"2,", "version=\"2.");
text = Regex.Replace(text, "version=\"3,", "version=\"3.");

And so on.. but it would be lame.

Any hints on how to single-handedly handle this?

Edit: I have other commas that I don't wanna replace, so text.Replace(",",".") can't do


回答1:


You need a regex like this to locate the comma

Regex reg = new Regex("(version=\"[0-9]),([0-9]\")");

Then do the repacement:

text = reg.Replace(text, "$1.$2");

You can use $1, $2, etc. to refer to the matching groups in order.




回答2:


(?<=version=")(\d+),

You can try this.See demo.Replace by $1.

https://regex101.com/r/sJ9gM7/52




回答3:


You can perhaps use capture groups to keep the numbers in front and after for replacement afterwards for a more 'traditional way' to do it:

string text = "version=\"1,0\"";
var regex = new Regex(@"version=""(\d*),(\d*)""");
var result = regex.Replace(text, "version=\"$1.$2\"");

Using parens like the above in a regex is to create a capture group (so the matched part can be accessed later when needed) so that in the above, the digits before and after the comma will be stored in $1 and $2 respectively.


But I decided to delve a little bit further and let's consider the case if there are more than one comma to replace in the version, i.e. if the text was version="1,1,0". It would actually be tedious to do the above, and you would have to make one replace for each 'type' of version. So here's one solution that is sometimes called a callback in other languages (not a C# dev, but I fiddled around lambda functions and it seems to work :)):

private static string SpecialReplace(string text)
{
    var result = text.Replace(',', '.');
    return result;
}
public static void Main()
{
    string text = "version=\"1,0,0\"";
    var regex = new Regex(@"version=""[\d,]*""");
    var result = regex.Replace(text, x => SpecialReplace(x.Value));
    Console.WriteLine(result);
}

The above gives version="1.0.0".

"version=""[\d,]*""" will first match any sequence of digits and commas within version="...", then pass it to the next line for the replace.

The replace takes the matched text, passes it to the lambda function which takes it to the function SpecialReplace, where a simple text replace is carried out only on the matched part.

ideone demo



来源:https://stackoverflow.com/questions/29466463/using-regex-replace-to-keep-characters-that-can-be-vary

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!