Регулярное выражение для соответствия последнему символу в строке - C # - PullRequest
0 голосов
/ 13 марта 2019

Как я могу удалить последний ';'в строке?

В случае комментария в конце строки мне нужно вернуть ';'перед комментарием.

Пример :

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

Ответы [ 2 ]

1 голос
/ 13 марта 2019

Вы не написали, что хотите сделать с персонажем, поэтому я дам вам решение, которое заменяет персонажа:

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 ;.
0 голосов
/ 13 марта 2019

Это немного уродливо с 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...