Regex преобразовать строку в действительное число, без десятичного знака, необязательный знак - PullRequest
0 голосов
/ 23 октября 2009

Я хочу удалить все после и включая десятичное число, и все нечисловые, кроме дефиса, если это первый символ. Пока у меня есть это: /[^0-9^-]|[^\.]+$/. Обратите внимание на то, как я блокирую удаление черточек с помощью ^-, потому что каким-то образом я хочу удалить только те черты, которые не являются первым символом (не знаком). Любая помощь? Спасибо.

Я просто хочу, чтобы удалить

  • Любые не 0-9 символы, кроме первого символа, если это тире (знак минус)
  • Все после и после десятичной точки

Напр .: 10js-_67.09090FD => 1067
-10a.h96 => -10

РЕДАКТИРОВАТЬ: Неважно, я подходил к этому неправильно, пытаясь сопоставить символы, которые не принадлежат, и я понял, что я не должен использовать для этого регулярное выражение Спасибо за ваши ответы, хотя я немного узнал о регулярных выражениях, и, возможно, кто-то другой с подобной проблемой найдет это.

Ответы [ 2 ]

2 голосов
/ 23 октября 2009

Попробуйте это:

Regex numbers = new Regex(@"^(-?\d*)[^0-9]*(\d*)\.", 
    RegexOptions.ECMAScript | RegexOptions.Multiline);
foreach (Match number in numbers.Matches("10js-_67.09090FD"))
{
    Console.WriteLine(
        Int32.Parse(
            number.Groups[1].Value + 
            number.Groups[2].Value));
}

Или вот этот:

Console.WriteLine(
    Int32.Parse(
        Regex.Replace(
            "10js-_67.09090FD", 
            @"^(-?\d*)[^0-9]*(\d*)\.([\s\S]*?)$", "$1$2", 
            RegexOptions.ECMAScript | RegexOptions.Multiline)));

Или вот этот:

var re = /^(-?\d*)[^0-9]*(\d*)\.([\s\S]*?)$/
alert(parseInt("10js-_67.09090FD".replace(re, "$1$2"),10));
1 голос
/ 23 октября 2009

Это будет /^(-?[0-9]+)[^0-9\.]*([0-9]*).*$/\1\2/ (используйте для sed, поскольку вы не говорите мне, на каком языке вы используете).

/^(-?[0-9]+)[^0-9\.]*([0-9]*).*$/
// '^'          ==&gtl From the Start
// '(..)'       ==&gtl Group 1
//     '-?'     ==&gtl An optiona '-'
//     '[0-9]+' ==&gtl Some numbers
// '[^0-9\.]*'  ==&gtl Anything but numbers and dot
// '(..)'       ==&gtl Group 2 (So this is the number after the dot)
//     '[0-9]*' ==&gtl Some numbers
// '.*$'        ==&gtl The rest

Тогда печатайте только группу 1 и группу 2 (/\1\2/).

Тесты:

$:~/Desktop$ echo "10js-_67.09090FD" | sed -r "s/^(-?[0-9]+)[^0-9\.]*([0-9]*).*$/\1\2/"
1067
$:~/Desktop$ echo "-10a.h96" | sed -r "s/^(-?[0-9]+)[^0-9\.]*([0-9]*).*$/\1\2/"
-10

Надеюсь, это поможет

...