我正在尝试编写代码,
任何包含单词“ ocean”的行,我都会在最后写上“ water”
我将如何与RegeEx进行此操作?
示例:
test1
abcdocean123
test2
test3
结果(保留文件中所有其他间距):
test1
abcdocean123 water
test2
test3
代码尝试:
public string FileRead(string path)
{
content = File.ReadAllText(path);
return content;
}
public string FileChange()
{
var lines = content.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)
.Select(line => Regex.Replace(line, @"\bocean\b\n", "water \n"));
content = String.Join("\n", lines);
return content;
}
答案 0 :(得分:1)
您需要检查一行是否包含ocean
,如果是,则仅将water
附加到该行:
var content = "test1\n\nabcdocean123 \n\n\ntest2\ntest3";
var lines = content.Split(new[] { "\n" }, StringSplitOptions.None)
.Select(line => line.Contains("ocean") ? $"{line}water" : line);
return string.Join("\n", lines);
请参见C# demo
如果您仍然需要使用正则表达式,请将line.Contains("ocean")
替换为Regex.IsMatch(line, @"\bocean\b")
或在那里需要的任何正则表达式。请注意,\b
是一个单词边界,\bocean\b
仅在不包含单词字符(数字,字母或下划线)时才匹配。
请注意,在不删除任何空行的情况下,您应该依靠换行符进行拆分,并且当将这些行重新合并时,您也不会丢失任何空行。
如果您真的想继续使用正则表达式,可以使用
var content = "test1\n\nabcdocean123 \n\n\ntest2\ntest3";
content = Regex.Replace(content, @"ocean.*", "$&water");
// If your line endings are CRLF, use
// content = Regex.Replace(content, @"ocean[^\r\n]*", "$&water");
Console.WriteLine(content);
请参见this C# demo
在这里,ocean.*
匹配ocean
子字符串,.*
匹配其余的 line ,$&
替换为找到的匹配项,然后{ {1}}已添加。如果行尾可能包含CR,并且water
与CR匹配,则[^\r\n]
是可取的,使用.
,CR和LF以外的任何字符更安全。
答案 1 :(得分:0)
答案 2 :(得分:0)
如果您的问题正确,那么在您的情况下完全不需要使用Regex
。
您只需检查包含ocean
短语的字符串,然后附加water
字即可。
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
private static readonly string Token = "ocean";
private static readonly string AppendToken = "water";
public static void Main()
{
var mylist = new List<string>(new string[] { "firststring", "asdsadsaoceansadsadas", "onemoreocean", "notOcccean" });
var newList = mylist.Select(str => {
if(str.Contains(Program.Token)) {
return str + " " +Program.AppendToken;
}
return str;
});
foreach (object o in newList)
{
Console.WriteLine(o);
}
}
}
您可以在DotnetFiddle
上运行此代码