正则表达式匹配字符串中的最后一个字符-C#

时间:2019-03-13 14:57:02

标签: c# regex

如何删除最后一个';'在字符串中?

如果在字符串末尾有注释,我需要返回';'在评论之前。

示例

"line 1 //comment
line2;
extra text; //comment may also contain ;." 

2 个答案:

答案 0 :(得分:1)

您没有写出您想要使用该字符做什么的内容,因此我在这里为您提供了一个替换字符的解决方案:

string pattern = "(?<!//.*);(?=[^;]*(//|$))";
Console.WriteLine(Regex.Replace("line 1 //comment", pattern, "#"));
Console.WriteLine(Regex.Replace("line2;", pattern, "#"));
Console.WriteLine(Regex.Replace("extra; text; //comment may also contain ;.", pattern, "#"));

输出:

line 1 //comment
line2#
extra; text# //comment may also contain ;.

答案 1 :(得分:0)

这对于Regex来说有点丑陋,但是在这里:

var str = @"line 1 //comment

line2; test;

extra text; //comment may also contain ;.";

var matches = Regex.Matches(str, @"^(?:(?<!//).)+(;)", RegexOptions.Multiline);
if (matches.Count > 0)
{
    Console.WriteLine(matches[matches.Count - 1].Groups[1].Index);
}

我们得到每行最后一个分号的匹配项(没有注释),然后查看这些匹配项的最后一个。

我们必须逐行执行此操作,因为注释适用于整行。

如果您要单独处理每一行(您的问题不是这样,而是隐含的意思),那么请遍历matches而不是只看最后一行。

如果要用另一个字符替换每个分号,则可以执行以下操作:

const string replacement = "#";
var result = Regex.Replace(str, @"^((?:(?<!//).)+);", "$1" + replacement, RegexOptions.Multiline);

如果要完全删除它,只需:

var result = Regex.Replace(str, @"^((?:(?<!//).)+);", "$1", RegexOptions.Multiline);

如果只想删除整个字符串中的最后一个分号,则可以使用string.Remove

var matches = Regex.Matches(str, @"^(?:(?<!//).)+(;)", RegexOptions.Multiline);
if (matches.Count > 0)
{
    str = str.Remove(matches[matches.Count - 1].Groups[1].Index, 1);
}