Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#仅在=符号后使用正则表达式替换值_C#_Regex - Fatal编程技术网

C#仅在=符号后使用正则表达式替换值

C#仅在=符号后使用正则表达式替换值,c#,regex,C#,Regex,好的,我有一个文本文件,其中包含: books_book1 = 1 books_book2 = 2 books_book3 = 3 我想保留“books\u book1=” 到目前为止,我已经: string text = File.ReadAllText("settings.txt"); text = Regex.Replace(text, ".*books_book1*.", "books_book1 = a", RegexOptions.Multiline); F

好的,我有一个文本文件,其中包含:

    books_book1 = 1
    books_book2 = 2
    books_book3 = 3
我想保留“books\u book1=”

到目前为止,我已经:

string text = File.ReadAllText("settings.txt");
text = Regex.Replace(text, ".*books_book1*.", "books_book1 = a",
RegexOptions.Multiline);
File.WriteAllText("settings.txt", text);
text = Regex.Replace(text, ".*books_book2*.", "books_book2 = b",
RegexOptions.Multiline);
File.WriteAllText("settings.txt", text);
text = Regex.Replace(text, ".*books_book3*.", "books_book3 = c",
RegexOptions.Multiline);
File.WriteAllText("settings.txt", text);
这导致:

书籍\u书籍1=a=1

文件的输出应为:

    books_book1 = a
    books_book2 = b
    books_book3 = c

提前非常感谢…

我认为这不是解决问题的最佳方法,但要使正则表达式实现您想要的功能,您可以执行以下操作:

var findFilter = @"(.*books_book1\s*=\s)(.+)";
var replaceFilter = "${1}a"    
text = Regex.Replace(text, findFilter, replaceFilter, RegexOptions.Multiline)   
File.WriteLine("settings.txt", text);
....
在这种情况下,正则表达式中
之间的代码是第一个也是唯一的反向引用捕获组,替换部分中的
${1}
将使用匹配的组文本创建所需的输出。另外,您会注意到我使用了
\s
作为空白,因此您与book111不匹配。我相信你还需要处理其他边缘案件

books_book1 = a
...

我认为这不是解决问题的最佳方法,但要让正则表达式实现您想要的功能,您可以执行以下操作:

var findFilter = @"(.*books_book1\s*=\s)(.+)";
var replaceFilter = "${1}a"    
text = Regex.Replace(text, findFilter, replaceFilter, RegexOptions.Multiline)   
File.WriteLine("settings.txt", text);
....
在这种情况下,正则表达式中
之间的代码是第一个也是唯一的反向引用捕获组,替换部分中的
${1}
将使用匹配的组文本创建所需的输出。另外,您会注意到我使用了
\s
作为空白,因此您与book111不匹配。我相信你还需要处理其他边缘案件

books_book1 = a
...
我在评论中说:


“如果文件这么简单,我个人会去重新创建它。假设您最初将文件中的所有值加载到某种类型的对象中,因此只需使用该对象以新值重新创建文件即可。比处理常规表达式要容易得多——测试和查看正在发生的事情更简单、更容易,如果需要,也更容易更改。”

我想再看一次,这是更真实的

从您在评论中所说的:“当程序加载时,它从这个文本文件中读取值,然后用户可以选择更改值并将其保存回文件“。这可能意味着您需要实际知道要替换的books1、books2等行中的哪一行,以便知道要输入哪些用户提供的值。这对于三个项目来说是很好的(虽然有点笨拙),但是如果你增加这个数字,那么你需要为每个新项目更新你的代码。这从来都不是一件好事,很快就会产生一些看起来非常可怕的代码,很容易让bug进入

如果在某种数据结构(如字典)中有新设置,那么正如我所说的,从头开始重新创建文件可能是最简单的。例如,请参见此完整包含的小代码段:

//Set up our sample Dictionary
Dictionary<string, string> settings = new Dictionary<string,string>();
settings.Add("books_book1","a");
settings.Add("books_book2","b");
settings.Add("books_book3","c");

//Write the values to file via an intermediate stringbuilder.    
StringBuilder sb = new StringBuilder();
foreach (var item in settings)
{
    sb.AppendLine(String.Format("{0} = {1}", item.Key, item.Value));
}

File.WriteAllText("settings.txt", sb.ToString());
//设置我们的示例字典
字典设置=新建字典();
设置。添加(“books_book1”、“a”);
设置。添加(“books_book2”、“b”);
设置。添加(“books_book3”、“c”);
//通过中间stringbuilder将值写入文件。
StringBuilder sb=新的StringBuilder();
foreach(设置中的变量项)
{
AppendLine(String.Format(“{0}={1}”,item.Key,item.Value));
}
writealText(“settings.txt”,sb.ToString());
这具有明显的优点,即更简单,如果您添加更多设置,它们将直接进入字典,您无需更改代码。

在我的评论中指出:


“如果文件这么简单,我个人会去重新创建它。假设您最初将文件中的所有值加载到某种类型的对象中,因此只需使用该对象以新值重新创建文件即可。比处理常规表达式要容易得多——测试和查看正在发生的事情更简单、更容易,如果需要,也更容易更改。”

我想再看一次,这是更真实的

从您在评论中所说的:“当程序加载时,它从这个文本文件中读取值,然后用户可以选择更改值并将其保存回文件“。这可能意味着您需要实际知道要替换的books1、books2等行中的哪一行,以便知道要输入哪些用户提供的值。这对于三个项目来说是很好的(虽然有点笨拙),但是如果你增加这个数字,那么你需要为每个新项目更新你的代码。这从来都不是一件好事,很快就会产生一些看起来非常可怕的代码,很容易让bug进入

如果在某种数据结构(如字典)中有新设置,那么正如我所说的,从头开始重新创建文件可能是最简单的。例如,请参见此完整包含的小代码段:

//Set up our sample Dictionary
Dictionary<string, string> settings = new Dictionary<string,string>();
settings.Add("books_book1","a");
settings.Add("books_book2","b");
settings.Add("books_book3","c");

//Write the values to file via an intermediate stringbuilder.    
StringBuilder sb = new StringBuilder();
foreach (var item in settings)
{
    sb.AppendLine(String.Format("{0} = {1}", item.Key, item.Value));
}

File.WriteAllText("settings.txt", sb.ToString());
//设置我们的示例字典
字典设置=新建字典();
设置。添加(“books_book1”、“a”);
设置。添加(“books_book2”、“b”);
设置。添加(“books_book3”、“c”);
//通过中间stringbuilder将值写入文件。
StringBuilder sb=新的StringBuilder();
foreach(设置中的变量项)
{
AppendLine(String.Format(“{0}={1}”,item.Key,item.Value));
}
writealText(“settings.txt”,sb.ToString());

这具有明显的优点,即更简单,如果您添加更多设置,它们将直接进入字典,您无需更改代码。

类似的内容如何(无错误检查):


类似这样的事情如何(无错误检查):


下面是一个更通用的方法的开始:

此正则表达式捕获最后一个数字,并考虑数字和空白长度的变化

text = Regex.Replace(text , @"(books_book\d+\s*=\s*)(\d+)", DoReplace)

// ... 

string DoReplace(Match m)
{
    return m.Groups[1].Value + Convert.ToChar(int.Parse(m.Groups[2].Value) + 96);
}

下面是一个更通用的方法的开始:

此正则表达式捕获最后一个数字,并考虑数字和空白长度的变化

text = Regex.Replace(text , @"(books_book\d+\s*=\s*)(\d+)", DoReplace)

// ... 

string DoReplace(Match m)
{
    return m.Groups[1].Value + Convert.ToChar(int.Parse(m.Groups[2].Value) + 96);
}

*
匹配除换行符以外的任意数量的字符<代码>*与前面的字符匹配任意次数
匹配除换行符以外的任何字符。问题到底是什么?你真的不需要
Regex
,是吗?您可以使用
string.Replace()
。这里有些奇怪。如果你只有那三里的话