2016-09-28 2 views
3

мне нужно регулярное выражение, возвращающую конкретный символ с десятичным числом до 1-е местаC# Regex получить конкретный символ с десятичным числом

У меня есть строка текст

(AvgC20.1 > 980000) && (C1>C2) MaxC20 MinC20.14 

после применения регулярных выражений получают следующий результат

AvgC20, MaxC20, MinC20 

Это регулярное выражение я использую

(Avg|Max|Min)[OHLVC]\d+ 

которые возвращают то, что я хочу, но не возвращает десятичное число до одного места

, но мне нужно привести как этот

AvgC20.1, MaxC20, MinC20.1 

ответ

4

Добавить дополнительный (?:\.\d+)? соответствие 1 или 0 вхождений . следует с 1 или более цифр:

(?:Avg|Max|Min)[OHLVC]\d+(?:\.\d+)? 
         ^^^^^^^^^^ 

Смотрите regex demo

enter image description here

(?:...)? является необязательным non-capturing group. Это необязательно (= соответствует одному или нулевому вхождению) из-за квантора ? (жадный, поэтому я упоминаю один или ноль, а не ноль или один). Группа без захвата используется для целей группировки без создания буфера для захваченного значения в памяти. Я предложил использовать группу non, поскольку итоговый результат должен быть равен всего значения соответствия, поэтому нет необходимости отслеживать и хранить эти значения.

Примечание на NON/захвата групп в .NET: В коде .NET, вы можете использовать пронумерованные захватив группы и сделать их не-захват с помощью RegexOptions.ExplicitCapture флага. Затем буферы памяти создаются только для названных групп захвата (например, (?<gr1>...)). Подробнее

Pattern:

  • (?:Avg|Max|Min) - Либо Avg, Max или Min
  • [OHLVC] - одна заглавная буква из множества
  • \d+ - 1 или более цифр
  • (?:\.\d+)? - необязательный последовательность . с последующим 1 или более ди мерзавцы.

Sidenote: это лучшая практика, чтобы запретить ветви одного и того же чередованием группы, чтобы соответствовать на одном и том же месте, и (?:Avg|Max|Min) лучше записать в виде (?:Avg|M(?:ax|in)). Однако то, что хорошо для машины, не так хорошо для человеческого глаза, поэтому из-за соображений читаемости я бы посоветовал сохранить первую группу как есть.

C# demo (обратите внимание, что RegexOptions.ExplicitCapture передается с помощью опции встроенного (?n)):

var s = "(AvgC20.1 > 980000) && (C1>C2) MaxC20 MinC20.14"; 
var pattern = @"(?n)(Avg|Max|Min)[OHLVC]\d+(\.\d+)?"; 
var result = Regex.Matches(s, pattern) 
     .Cast<Match>() 
     .Select(p => p.Value) 
     .ToList(); 
foreach (var r in result) // Demo printing the results 
    Console.WriteLine(r); 
+0

Может быть, вы должны объяснить, почему ':' необходимо. Начинающие не будут знать, что круглые скобки - это больше, чем просто способ группировки символов. –

+0

Хорошо, я добавляю дополнительную информацию об этом. –

+0

\ d + должно быть \ d? – jdweng

Смежные вопросы