Заменить : и любой символ после этого с помощью регулярного выражения

#c# #regex

Вопрос:

У меня есть следующие строки

 var s1 = "Group:0.Devices.Cabins:0.Position.GroupStop:0.GroupStop";
var s2 = "Group.Devices.State:15X.GenericState";
var s3 = "Group.Devices.State.HealthState";
var s4 = "Group:1.Devices:7A.Cabins:0.Doors:0.State:0";
 

Мне нужно удалить : и any char после этого .Ожидаемый результат:

 Group.Devices.Cabins.Position.GroupStop.GroupStop
Group.Devices.State.GenericState
Group.Devices.State.HealthState
Group.Devices.Cabins.Doors.State
 

Я использовал что-то вроде этого:

 Console.WriteLine(Regex.Replace(Regex.Replace(s1, @":.*?.", "."), @":.*?$", ""));
Console.WriteLine(Regex.Replace(Regex.Replace(s2, @":.*?.", "."), @":.*?$", ""));
Console.WriteLine(Regex.Replace(Regex.Replace(s3, @":.*?.", "."), @":.*?$", ""));
Console.WriteLine(Regex.Replace(Regex.Replace(s4, @":.*?.", "."), @":.*?$", ""));
 

Это работает, но есть ли более эффективные способы, как это сделать? Я хочу использовать его с скомпилированным регулярным выражением.

 private static Regex _regex = new Regex(@"....", RegexOptions.Compiled);
 

Затем _regex.Replace(s1, string.Empty);

Не могли бы вы, пожалуйста, помочь мне объединить 2 регулярных выражения в одно? Заранее спасибо

Комментарии:

1. Вы также можете попробовать Regex.Replace(s4, ":. ?(\.|$)?", "$1") .

2. @SGKoishi спасибо, но почему бы и нет :[^.]* ?

Ответ №1:

Вы можете использовать классы отрицательных символов для создания одного регулярного выражения, соответствующего части текста, которую вы хотите удалить. Я сопоставляю двоеточие, за которым следует ноль или более неполноценных символов:

 using System;
using System.Text.RegularExpressions;

var s1 = "Group:0.Devices.Cabins:0.Position.GroupStop:0.GroupStop";
Console.WriteLine(Regex.Replace(s1, @":[^.]*", "")); // Group.Devices.Cabins.Position.GroupStop.GroupStop 
 

sharplab