Войти

Показать полную графическую версию : Регулярные выражения


Kickpopal
16-04-2017, 18:46
Здравствуйте, нужно помощь с обработкой исключений.Задача такая: нужно чтобы пропускало строки такого вида: целое или десятичное число(может быть, как положительным, так и отрицательным), на всё остальное должно ругаться.

Т.е, строку такого вида должно пропускать: "45.4545" или "-45.3434" или просто "45", а вот например так: ".45" или "44-455" - уже нет.

Вот что я написал:
for /f "delims=" %%A in ('echo.%number%^| findstr "[^0-9][.-]"') do set "nv=%%~A"
if not "%number%"=="%nv%" (goto :prog1) else (echo nekorrectnie dannie&goto vibor)

Но тут как видно, просто если есть "." или "-" - пропускается, а нужно, чтобы ещё от позицию зависило, т.е "-" должен быть только на первой позиции, если он на другой - то уже не должно пропускать, а точка, соответственно, не может быть на 1-ой и на последней позиции и должна быть в единственном виде.

Помогите довести до ума, спасибо.

Kickpopal
16-04-2017, 19:01
Также забыл упомянуть про вариант с нулями.просто 0 - должно пропускать, а вот всякие 000051 либо должно преобразовать к виду 51 либо вообще не пропускать.Я выбрал второе(хотя 1, наверное, более рациональный вариант) и сделал как-то так:
if "%number:~0,1%"=="0" (@if "%number:~1,1%"=="0" (echo "vvedite 4islo ne na4inauheecy c 0"&goto vibor) else (goto :npr1))
Т.е если первый 0, то идёт проверочка на второй 0, если ещё 2, то не пропускает, а если второй не ноль - то всё ок.
Но не уверен, что это хороший код.Лучше бы как-то в регулярку это занести.

Iska
16-04-2017, 19:13
Kickpopal, sed.exe, WSH, PowerShell или mshta.exe. Для findstr.exe задача, боюсь, будет не по плечу.

Iska
16-04-2017, 19:31
Kickpopal, а Вам зачем? В принципе, и .45, и 000051 — вполне допустимые числа.

Kickpopal
16-04-2017, 19:37
Kickpopal, а Вам зачем? В принципе, и .45, и 000051 — вполне допустимые числа. »
ну с точкой и нулями - допустим, а вот 45-453 - уже не совсем допустимое.Мне нужно чтобы именно десятичные или целые числа принимало для дальнейшей обработки.Я так понимаю в CMD регулярку нормально никак не сделать?

Iska
16-04-2017, 20:33
для дальнейшей обработки. »
Я про это и интересовался — для какой обработки?

Самое простое — использовать внешний WSH файл-фильтр, наподобие:
Option Explicit

Dim strValue


With WScript.CreateObject("VBScript.RegExp")
.Pattern = "^[-+]?[0-9]*\.?[0-9]+$"

For Each strValue In Split(WScript.StdIn.ReadAll(), vbCrLf)
strValue = Trim(strValue)

If .Test(strValue) Then
WScript.StdOut.WriteLine CStr(CDbl(strValue))
End If
Next
End With

WScript.Quit 0

Пример кода пакетного файла для фильтрации:
@echo off
setlocal enableextensions enabledelayedexpansion

(
echo 45.4545
echo -45.3434
echo 45
echo 0.45
echo .45
echo 44-455
echo 0
echo 000
echo 000051
)| cscript.exe //nologo "0002.vbs"


endlocal
exit /b 0

http://i.imgur.com/0T4lgF6.png
P.S. Можно, конечно, посидеть и слепить в одну строку на JScript для mshta.exe, чтобы без лишнего файла, но что-то не манится.

Kickpopal
16-04-2017, 20:51
Я про это и интересовался — для какой обработки? »
А далее число переводится из 10 с.c в разные системы счисления.И чтобы всё работало как нужно и нужна обработка исключений.


Спасибо большое, я понял.

Iska
16-04-2017, 20:54
А далее число переводится из 10 с.c в разные системы счисления. »
Может проще сразу на WSH/PoSH делать реализацию?

Kickpopal
16-04-2017, 20:56
Может проще сразу на WSH/PoSH делать реализацию? »
Да, конечно, проще.Но нужно было именно здесь :)

Iska
16-04-2017, 21:07
Как скажете. Текущая реализация Вас устроит?

Kickpopal
16-04-2017, 21:09
Как скажете. Текущая реализация Вас устроит? »
Да, спасибо.




© OSzone.net 2001-2012