2 回答
TA贡献1827条经验 获得超8个赞
你没有写你想对这个角色做什么,所以我在这里给你一个替换角色的解决方案:
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 ;.
TA贡献1875条经验 获得超5个赞
正则表达式有点难看,但它是:
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);
}
- 2 回答
- 0 关注
- 600 浏览
添加回答
举报
