Регулярное выражение преобразует строку в допустимое число, без десятичной дроби, знак необязателен

StackOverflow https://stackoverflow.com/questions/1611038

Вопрос

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

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

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

Бывший.:10js-_67.09090FD => 1067
-10a.h96 => -10

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

Это было полезно?

Решение

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

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));

Другие советы

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

/^(-?[0-9]+)[^0-9\.]*([0-9]*).*$/
// '^'          ==>l From the Start
// '(..)'       ==>l Group 1
//     '-?'     ==>l An optiona '-'
//     '[0-9]+' ==>l Some numbers
// '[^0-9\.]*'  ==>l Anything but numbers and dot
// '(..)'       ==>l Group 2 (So this is the number after the dot)
//     '[0-9]*' ==>l Some numbers
// '.*$'        ==>l 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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top