Home > Software engineering >  C# Regular expression To replace all matches in the string
C# Regular expression To replace all matches in the string

Time:10-24

I Have one text file and I want to replaces all matches in each line, so I defined Pattern and I loop through to the text file after I want to write the result in another file, unfortunately my pattern is only replace first occurrence of the word what did |I do in a wrong way? Content of text file: "testebook kok o testebook\ntestbbb1232 joj ds testbbb1232"

using System.Text.RegularExpressions;
string filePath = "test.txt";
string fileNewPath = "test1.txt";

string ma = @"^test[0-9a-zA-Z] ";

string newString = string.Empty;
using(StreamReader sr = new(filePath)){
    string line = sr.ReadLine();

    while (line != null){
        
        while(Regex.IsMatch(line, ma) != false){
            line = Regex.Replace(line, ma, "");
        }

        newString  = line   "\n";
        line = sr.ReadLine();
    }
}
using(StreamWriter sw = new(fileNewPath)){
    sw.WriteLine(newString);
}

CodePudding user response:

So I modified My pattern and remove start with character and everything works now as desired

using System.Text.RegularExpressions;
string filePath = "test.txt";
string fileNewPath = "test1.txt";

MatchesFinder test = new(filePath, fileNewPath);
test.RunTheProcess();

class MatchesFinder{
    private string filePath;
    private string fileNewPath;
    private string ma = @"test[a-zA-Z0-9] ";
    public MatchesFinder(string filePath,string fileNewPath){
        this.filePath = filePath;
        this.fileNewPath = fileNewPath;

    }
    public void RunTheProcess(){
        string newString = string.Empty;

        using(StreamReader sr = new(filePath)){
            string line = sr.ReadLine();

            while (line != null){
                
                while(Regex.IsMatch(line, ma) != false){
                    line = Regex.Replace(line, ma, string.Empty);
                }

                newString  = line.TrimStart()   "\n";
                line = sr.ReadLine();
            }
        }
        using(StreamWriter sw = new(fileNewPath)){
            sw.WriteLine(newString);
        }
    }
}

CodePudding user response:

I think you don´t need to check IsMatch separately, just calling Regex.Replace should yield the same result.

Also, newString = line.TrimStart() "\n"; means you´re copying all the lines you´ve already checked every time you append a new line. I´d either write directly to the output stream or at least use a StringBuilder if you really want to have the full file in memory for some reason.

Something like this:

using var sw = new StreamWriter(fileNewPath);
using var sr = new StreamReader(filePath);
        
var line = sr.ReadLine();
while (line != null){             
    line = Regex.Replace(line, ma, string.Empty);
                
    sw.WriteLine(line.TrimStart());
    line = sr.ReadLine();
}

CodePudding user response:

Your code is correct but your regex pattern is not correct. you should write this:

string ma = @"test[0-9a-zA-Z] ";

The letter "^" has removed from pattern

  • Related