Форум программистов, компьютерный форум, киберфорум
Perl: Web
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/15: Рейтинг темы: голосов - 15, средняя оценка - 4.73
8 / 8 / 1
Регистрация: 06.09.2014
Сообщений: 52
1

Написать регулярное выражение для выделения из строки только одного числа на определённой позиции

14.05.2015, 09:51. Показов 3031. Ответов 6
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Товарищи, подскажите!
Как написать рег. выражение для выделения из строки только одного числа на определённой позиции:
есть строка типа " 12 23 -123 34 " - начало и конец строки могут быть любым пробельным символом (или несколько символов - \s*), числа разделены также любыми последовательностями \s+.
Необходимо получать число на (например) третьей позиции, т.е. -123.

P.S.:
Я могу получить только все числа паттерном "((?<=\s)|(?<=\A))([-]{0,1}\d+)(?=(\s|\Z))"
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2015, 09:51
Ответы с готовыми решениями:

Регулярное выражение работает только для строки с дословными литералами
Я очень мало знаком с регулярными выражениями. Подозреваю, что не вижу чего то очевидного. Вот код...

Написать регулярное выражение для поиска строки
Доброго времени суток. Изучаю регулярные выражения. Столкнулся с проблемой. Как написать рег выр...

Регулярное выражение для выделения имени файла из пути
Приветствую. Есть задание: &quot;Создать запрос для выделения собственно имени файла из полного его...

Нужно написать регулярное выражение для поиска числа в строке
Нужно в строке найти данную строку: leads=16098307 При этом надо учесть, что между и может...

6
63 / 38 / 6
Регистрация: 24.01.2013
Сообщений: 136
14.05.2015, 23:18 2
Perl
1
2
3
my $str = " 12 23 -123 34 ";
 $str =~ /^\D*(\d+)\D+(\d+)[^\-\d]+([\-\d]+)/;
 print "$3 \n";
1
8 / 8 / 1
Регистрация: 06.09.2014
Сообщений: 52
15.05.2015, 10:27  [ТС] 3
Спасибо, petrovish1981, сейчас буду пробовать... Но я не могу написать в отдельной строке "$3", т.к. всё это выражение идёт в
C++
1
get_value = boost::basic_regex<wchar_t>("выражение")
при помощи которого происходит парсинг:
C++
1
Iterator = boost::regex_iterator<std::wstring::const_iterator>(CurrLine.begin(), CurrLine.end(), get_value);
0
5991 / 2000 / 323
Регистрация: 10.12.2013
Сообщений: 6,891
15.05.2015, 17:09 4
C++
1
2
3
4
5
6
7
8
9
10
std::string s("7 -12 34 -956 88");
 
boost::regex re("([-]?\d+)\b");
 
boost::sregex_iterator it(s.begin(), s.end(), re);
 
boost::sregex_iterator end;
 
while(it != end)
  std::cout  << *it++ << " # ";
1
352 / 222 / 25
Регистрация: 30.09.2012
Сообщений: 548
16.05.2015, 20:14 5
Попробуйте так
Perl
1
2
3
4
5
6
7
8
9
10
#!perl
 
use strict;
use warnings;
 
my $txt = "     12   23 -123 34   ";
 
my $rez = ($txt =~ m/(\S+)/g)[2];
 
print "$rez\n";
1
8 / 8 / 1
Регистрация: 06.09.2014
Сообщений: 52
22.05.2015, 12:36  [ТС] 6
volodin661, в XE2 c boost 1.39 не находит совпадений в Вашей строке с паттерном "([-]?\d+)\b".
pka, спасибо также за ответ, но мне надо как-то "инициализировать" переменную $txt в самом рег. выражении:
до строки
C++
1
($txt =~ m/(\S+)/g)[2]
я не знаю как через boost:: задать переменную
C++
1
$txt = "     12   23 -123 34   "
которая, по хорошему, есть
C++
1
UnicodeString CurrLine.c_str()
Подскажите, как, плииз, или что почитать хотя бы

P.S.: я сейчас пробую получать [n]-ые совпадения через
C++
1
boost::wsregex_token_iterator(CurrLine.begin(), CurrLine.end(), get_values, n)
но пока не получается...

Добавлено через 22 минуты
volodin661, извиняюсь, конечно находит, но с "([-]?\\d+)\\b". И находит все подряд, а не третью например.

Добавлено через 13 минут
Похоже, удалось сделать через "boost::wsregex_token_iterator", но тогда надо указывать структуру всей строки, а не просто одного числа, которое ищем... Получилось типа
C++
1
boost::basic_regex<wchar_t> get_all(L"\\A\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)\\s*\\Z");
Для строк, содержащих 3 int, в которых ищется только 2-ое число работает так:
C++
1
boost::wsregex_token_iterator xItFull(CurrLine.begin(), CurrLine.end(), get_all, 2);
0
5991 / 2000 / 323
Регистрация: 10.12.2013
Сообщений: 6,891
22.05.2015, 15:22 7
Лучший ответ Сообщение было отмечено Whatson2 как решение

Решение

Цитата Сообщение от Whatson2 Посмотреть сообщение
volodin661, извиняюсь, конечно находит, но с "([-]?\\d+)\\b". И находит все подряд, а не третью например.
да-да, два бэк_слэша, но ты же в Перл зашёл, мы тут избаловались, обходимся одним ))

и понятное дело, что всё подряд, ты же итератор просил(см. свой пример), я тебя его и дал,
а отсчитать итератором третье совпадение даже пьяная девушка сможет, потому я и не стал обижать тебя раз'яснениями.
2
22.05.2015, 15:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.05.2015, 15:22
Помогаю со студенческими работами здесь

Регулярное выражение для выделения слов, начинающихся с заглавной буквы
Составить регулярное выражение, позволяющее выделить в тексте cлова, начинающиеся с Заглавной...

Регулярное выражение для получения чисел из строки, где эти два числа записаны через слеш
Ввожу строку &quot;1/3&quot;, а оттуда хочу достать только 1 и 3. Помогите составить регулярное выражение

Регулярное выражение: Выбрать из строки только первые 4 цифры
Нужно написать регулярку что б из текста &quot;выф31ва6р2па6пав54013 &quot; выбрать только первые 4 цифры (от...

Регулярное выражение где только числа и английские буквы доступны
Если через регулярку только числа это будет /^\d+$/i, то как добавить ещё английские буквы?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru