2016-12-19 3 views
1

У меня есть Regex для удаления нецифровых символов до разбора десятичного числа.Фиксация регулярных выражений нечисловыми символами

Я использую следующий код

Regex.Replace(myStr, "[^0-9.]", ""); 

Теперь это работает для десятичных чисел, но он удаляет «знак» характер, то есть выход для «A16.1» и «A16.1» возвращается как «16.1 »...

Использование следующих отредактированной версии, кажется, работает

Regex.Replace(myStr, "[^-0-9.]", ""); 

Но, будучи незнаком с Regex, может опытный пользователь подтверждает это право выражение ...?

+1

'[^ -0-9.]' Соответствует символу, отличному от '-', digit или' .'. Это все, что вам нужно знать, или что-то еще? –

+0

ОК, поэтому я заменяю любой символ, кроме пустых строк - так что это именно то, что мне нужно, спасибо! – neggenbe

+0

Затем, это ошибка [* Reference - Что означает это регулярное выражение?] (Http://stackoverflow.com/questions/22937618/reference-what-does-this-regex-mean) –

ответ

3

Я предлагаю

-?[0-9]+(\.[0-9]+)? 

узора, то есть удаления десятичных будут

string result = Regex.Replace(myStr, @"-?[0-9]+(\.[0-9]+)?", ""); 

объяснение:

-?   one or zero minus sign "-" - sign 
[0-9]+  at least one digit 
(\.[0-9]+)? followed by one or none 
       fractional part (decimal separator and at least one digit) 

В случае, если вы хотите получить (не удалить) номера, используйте Matches:

string myStr = "-1,2.3.de2.43."; 

string[] numbers = Regex 
    .Matches(myStr, @"-?[0-9]+(\.[0-9]+)?") 
    .OfType<Match>() 
    .Select(match => match.Value) 
    .ToArray(); 

// Test 
Console.Write(string.Join(Environment.NewLine, numbers)); 

исход

-1 
2.3 
2.43 
+0

Спасибо +1 за объяснение.В качестве примечания: форсирование десятичной части делает невозможным обращение к случаю, когда нет дробной части, поэтому я фактически использую '@" [^ - 0-9.] "'. – neggenbe

+1

@neggenbe: обратите внимание на '' 'в' (\. [0-9] +)? ', Что означает * нулевую или одну * дробную часть; поэтому * не имеет частичной части * случай закрыт –

+0

Не могли бы вы расширить это для обработки .1 как 0,1 и 1. как 1.0 (по крайней мере, интерпретатор Python имеет дело с ними в виде десятичных чисел). – CodeMonkey

1

В выражении [^-0-9.] дефис символ имеет особое значение в квадратных скобках ... если он не приходит на с самого начала или конца этих квадратных скобок. Символ - означает, что он принимает диапазон: в этом случае что-либо между буквами 0 и буква 9, как в 0-9.

Однако, когда дефис является первым или последним, ему нечего делать «от» (или «до»), поэтому его нельзя рассматривать как «диапазон» и поэтому анализируется как символ -.

Я обнаружил, что, будучи немного более многословным и избежать дефис позволяет пользователю размещать дефис в любом месте в пределах группы символов блока квадратным, и не беспокоиться, что случайно анализироваться как индикатор «Диапазон»: [^\-0-9.] или [^0-9\-.] или [^0-9.\-]

То, что у вас выше, работает правильно из-за размещения дефиса либо в начале, либо в конце, где вам не нужно явно скрывать символ, но его может быть легче читать (и расширять в будущем) если вы идете с экранированной версией, чтобы вы (или другие пользователи) знали, что дефис должен использоваться буквально как символ дефиса.