Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP: RegExp
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.62/95: Рейтинг темы: голосов - 95, средняя оценка - 4.62
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
1

Нужно извлечь текст между определенными символами (в строке они встречаются несколько раз)

22.04.2012, 14:40. Просмотров 18007. Ответов 4
Метки нет (Все метки)

нужно из строки текста, содержащего и точки, и двоеточия (их может быть несколько), извлечь часть текста, находящуюся слева от самого правого двоеточия, которая не содержит точек. поясню на примере.

строка:

слово0. слово1 слово2: слово3. слово4 слово5: слово6.
вот эта моя неудачная попытка:

\..+:.+\.
выбирает мне все между самой левой точкой и самым правым двоеточием:

слово1 слово2: слово3. слово4 слово5
а мне нужно только то, что выделено.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.04.2012, 14:40
Ответы с готовыми решениями:

Регулярка, отлавливающая текст, который не заканчивается определенными символами
Добрый день! Задача есть такая - отловить ссылки вида /catalog/название...

Возможен ли глобальный поиск значений между определенными символами?
Приветствую товарищи! Меня терзает вопрос, можно ли как-нибудь с помощью...

Выделить текст между символами
Есть строка вида blalbalbal t=НУЖНЫЕ_МНЕ_ДАННЫЕ" class="test class" blablabal...

Исключить теги и текст между специальными символами
Всем доброго времени суток! Мне нужно выбрать и заменить все слова, исключая...

Регулярные выражение. Получить текст, который находится между символами
Есть текст такого типа: {"response":} как вывести следующие данные: 1 Павел...

4
Vovan-VE
13161 / 6546 / 1038
Регистрация: 10.01.2008
Сообщений: 15,070
22.04.2012, 16:35 2
Perl
1
/([^.]+)(?=:[^:]*$)/
PHP
1
2
if (preg_match('/([^.]+)(?=:[^:]*$)/', 'слово0. слово1 слово2: слово3. слово4 слово5: слово6.', $m))
    print_r($m);
Добавлено через 4 минуты
Perl
1
2
3
4
5
6
/
    ([^.]+)         # искомый текст, не содержащий точки,
    (?=             # за которым дальше должно быть
        : [^:]* $   # двоеточие, любой текст, кроме двоеточия, и конец
    )
/x
Кстати, в таком случае бдует такое совпадение (так и было оговорено: "которая не содержит точек"):
слово0. слово1 слово2: слово3. слово4 :слово5: слово6.
1
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
23.04.2012, 13:53  [ТС] 3
Vovan-VE, просто здорово! спасибо большое!

Добавлено через 13 часов 48 минут
Vovan-VE, я понимаю, что сажусь на голову, но "в самый последний раз", еще такое, пожалуйста:

abc0 abc1 abc3 (123). abc4 abc5.
т.е. нам известно, что в строке имеется нечто, выделенное италиком "\(\d\d\d\)\. " (три цифры в скобках, после них точка и пробел), нужно извлечь все правее до конца.

как вариант, как выбрать все между двумя шаблонами? например, здесь (жирное выбираем, италик - шаблоны)

abc0 abc1 abc3 (123). abc4 abc5.USSR abc6, abc7.
ну и чтоб я больше не морочил голову, если есть толковая ссылка...
0
Xero201
64 / 62 / 19
Регистрация: 27.12.2008
Сообщений: 212
24.04.2012, 20:14 4
2 Vovan-VE: не очень удачный вариант, слишком долгая проверка, вот сравни варианты заточки под конкретный случай:

1.
/\.([^.]+):(?=[^:]*$)/
поиск начиная с конкретного символа (если точка обязательна)

2.
перевернуть строку и
/:([^.]+)(?=\.|$)/

3.
использовать нативные функции поиска последнего символа и обрезки


примерная реализация и тесты:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
$timesToDo = 100;
$testString = "";
for($i=0;$i<100;$i++){
$testString .= "слово0. слово1 слово2: слово3. слово4 слово5: слово6.";
}
 
$start = gettimeofday();
for($i=0;$i<$timesToDo; $i++){
    preg_match('/([^.]+)(?=:[^:]*$)/', $testString);
}
$final = gettimeofday();
 
$sec = ($final['sec']+$final['usec']/1000000) - ($start['sec']+$start['usec']/1000000);
 
print "v0 = $sec <br />";
 
 
 
$start = gettimeofday();
for($i=0;$i<$timesToDo; $i++){
    preg_match('/\.([^.]+):(?=[^:]*$)/', $testString);
}
$final = gettimeofday();
 
$sec = ($final['sec']+$final['usec']/1000000) - ($start['sec']+$start['usec']/1000000);
 
print "v1 = $sec <br />";
 
 
 
$start = gettimeofday();
for($i=0;$i<$timesToDo; $i++){
    
    $text = strrev($testString);
    preg_match('/:([^.]+)(?=\.|$)/', $text);
}
$final = gettimeofday();
 
$sec = ($final['sec']+$final['usec']/1000000) - ($start['sec']+$start['usec']/1000000);
 
print "v2 = $sec <br />";
 
 
$start = gettimeofday();
for($i=0;$i<$timesToDo; $i++){  
 
$text = substr($testString,0,strrpos($testString, ":")-1);
substr($text,strrpos($text, ".")+1);
 
}
$final = gettimeofday();
 
$sec = ($final['sec']+$final['usec']/1000000) - ($start['sec']+$start['usec']/1000000);
 
print "v3 = $sec <br />";
 
/*
v0 = 2.52820491791 
v1 = 0.100574970245 
v2 = 0.00159311294556 
v3 = 0.000470161437988 
*/
1
novi4ok
551 / 504 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
26.04.2012, 14:03  [ТС] 5
Цитата Сообщение от Xero201 Посмотреть сообщение
вот сравни варианты заточки под конкретный случай:

1.
/\.([^.]+)?=[^:]*$)/
поиск начиная с конкретного символа (если точка обязательна)
этот шаблон выбирает и саму точку, и двоеточие. а у Vovan - только то, что нужно.

Добавлено через 2 часа 2 минуты
нужно "разложить на составляющие" строку вида:

Albers, M. (2008). The financialization of home and the mortgage market crisis. Competition and Change, 12, 148–166.
отдельно вытащить каждое поле, обозначенное своим цветом.
не очень ловко, но сумел достать все кроме Competition and Change. ясно, что левее его - точка, а правее - запятая, после которой поле из пробелов и цифр, затем замятая, поле из пробелов, цифр и тире, точка (может и не быть, наверное), и конец.

Добавлено через 13 часов 11 минут
нашел "нечто", что работает (выбирает Competition and Change):

(?<=\.)([^.]+)(?=,[^:]*,[^:]*$)



, но этот образец выберет его, даже если правее будут не цифры, а что угодно. лишь бы количество запятых сходилось.
можно ли записать, "регулярно выражаясь",

"любой текст, содержащий любое количество цифр и пробелов"?

"любой текст, составленный из символов x,y и z"?
0
26.04.2012, 14:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.04.2012, 14:03

Как составить регулярку для поиска между двумя символами? Например, между { и }, между [ и ]
Здравствуйте. Как составить регулярку между двумя знаками. Например между {...

Вытянуть из строки текст между определенными символами
Всем привет, ранее писал на делфи, и вот начал учить c# Столкнулся с такой...

Замена текста в строке, находящегося между определенными символами
Привет! Ребята, как проще всего можно в строке сделать замену определенного...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru