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

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

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

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

Ex.: 10js-_67.09090FD => 1067
-10a.h96 => -10

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


person mk12    schedule 23.10.2009    source источник


Ответы (2)


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

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));
person Rubens Farias    schedule 23.10.2009

Это будет /^(-?[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

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

person NawaMan    schedule 23.10.2009
comment
Я использую javascript и использовал str.replace() для замены символов на . - person mk12; 23.10.2009