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

Я думаю, что было бы безопаснее делать что-то вроде этого вместо того, чтобы вручную добавлять дни:

import datetime
today = datetime.date.today()

def addMonths(dt, months = 0):
    new_month = months + dt.month
    year_inc = 0
    if new_month>12:
        year_inc +=1
        new_month -=12
    return dt.replace(month = new_month, year = dt.year+year_inc)

newdate = addMonths(today, 6)
0
задан Sari 13 March 2019 в 15:29
поделиться

2 ответа

Это немного уродливо с 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);
[1112 ] Если вы просто хотите удалить последнюю точку с запятой во всей строке, вы можете просто использовать string.Remove:

var matches = Regex.Matches(str, @"^(?:(?<!//).)+(;)", RegexOptions.Multiline);
if (matches.Count > 0)
{
    str = str.Remove(matches[matches.Count - 1].Groups[1].Index, 1);
}
0
ответ дан canton7 13 March 2019 в 15:29
поделиться

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

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
ответ дан Nicolas 13 March 2019 в 15:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: