Страницы: 1
RSS
Как сделать проверку на число через регулярные выражения? Вылетает процедура., что не так с этим? - "(^+\d{1,}\s+[А-Яа-яёЁ0-9A-Za-z\-]{1,})(\s|^)"
 
Добрый день!

Мне сказали отдельно вынести вопрос по регулярным выражениям отсюда (104564-zamena-otdelnykh-slov-s-regulyarnymi-vyrazheniyami)

Я пыталась сделать такое: если первая отдельностоящая группа это цифры (без вкрапления букв) и есть второе слово за пробелом, то соединить их нижним подчеркиванием.
Например "ООО 7 континент мира" -> "7_континент", или "ЗАО 29 спуск" -> "29_спуск", но! "7Б Куликово ЧП" - это "7Б", но! "777 фирма" -> "777"
Вы могли бы помочь? Как проверить, что первая группа до пробела это только числа?

Я представляла бы себе паттерн для задачки с цифрами таким:
"(^+\d{1,}\s+[А-Яа-яёЁ0-9A-Za-z\-]{1,})(\s|^)" - но в примере ниже он не работает.

Вот этот блок у меня вылетает:
Код
If regex.Test(txt) Then
    Set matches = regex.Execute(txt)
    txt = matches.Item(0)
    txt = Replace(txt, " ", "_")
Else
    regex.Pattern = "(^+[А-Яа-яёЁ0-9A-Za-z\-]{1,})(\s|^)"
    If regex.Test(txt) Then
        Set matches = regex.Execute(txt)
        txt = matches.Item(0)
    Else
        txt = "-"
    End If
End If


Смысл кода выше - если первое слово - все_знаки_цифры - то обрабатывем, как я описала выше. Если это буквы, то берем _только_ первое слово. Если букв-цифр не имеется - т.е. пусто или пробелы, то ставим "-".
Работать надо не 12 часов, а головой.
 
Код
Function InsUnderLine$(s$)
  Dim re: Set re = CreateObject("VBScript.RegExp")
  re.Pattern = "(\d+) ([А-Яа-яЁё]+)"
  InsUnderLine = re.Replace(s, "$1_$2")
End Function
Изменено: Ігор Гончаренко - 15.05.2018 04:02:55
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Спасибо.
А почему мой код вылетает=не работает?
Я что-то неправильно написала?  Делала как в учебнике.
Работать надо не 12 часов, а головой.
 
Доброе время суток
Цитата
Leanna написал:
Я что-то неправильно написала?
Да
Цитата
Leanna написал:
^+
Не может быть несколько начал строк. + (один или больше подряд идущих символов) не применим к ^, $
Да и тут
Цитата
(\s|^)
Как может строка заканчиваться на начало строки?
Изменено: Андрей VG - 15.05.2018 09:34:43
 
Цитата
Leanna написал:
Делала как в учебнике.
делать нужно не как в учебнике, а до тех пор, пока код не начнет работать так, как Вы планировали
к чему вся эта суете с началами и окончаниями строки если нужны:
- группа цифр
- пробел
- группа букв
Изменено: Ігор Гончаренко - 15.05.2018 10:01:11
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
C $ ошибку поняла.

"(^+\d{1,}\s+[А-Яа-яёЁ0-9A-Za-z\-]{1,})(\s|^)" – надо + убрать совсем?
Т.е. "(^\d{1,}\s+[А-Яа-яёЁ0-9A-Za-z\-]{1,})(\s|^)"
Или надо поставить скобочку квадратную либо круглую?
"(^[+\d{1,}]\s+[А-Яа-яёЁ0-9A-Za-z\-]{1,})(\s|^)" либо "(^(+\d{1,})\s+[А-Яа-яёЁ0-9A-Za-z\-]{1,})(\s|^)"
Правильно я понимаю, что убирание плюса ИЛИ заключение в квадратные скобки[+\d{1,}] ИЛИ круглые скобки (+\d{1,}) - дадут один и тот же эффект в данном случае?

Igor у вас пример замечательный и познавательный.

Просто мне хотелось бы ещё разобрать – что у меня не так, из того, что наваялось с моего уровня познаний.

Во второй части убрала + т.е. "(^[А-Яа-яёЁ0-9A-Za-z\-]{1,})(\s|$)" заработало..

Текущий код:
Код
regex.Pattern = "(^\d{1,}\s+[А-Яа-яёЁ0-9A-Za-z\-]{1,})(\s|$)"
If regex.Test(txt) Then
Set matches = regex.Execute(txt)
txt = Trim(matches.Item(0))
txt = Replace(txt, " ", "_")
Else
regex.Pattern = "(^[А-Яа-яёЁ0-9A-Za-z\-]{1,})(\s|$)"
If regex.Test(txt) Then
Set matches = regex.Execute(txt)
txt = Trim(matches.Item(0))
Else
txt = "-"
End If
End If
Изменено: Leanna - 15.05.2018 12:12:02
Работать надо не 12 часов, а головой.
 
о RegExp написаны книжки. читайте и экспериментируйте пока не проникнетесь философией того, что вложено в RegExp.
удачи!
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
Страницы: 1
Наверх