Что нового

[RegExp] Содержимое между тегами исключая сами тэги

Статус
Закрыто для дальнейших ответов.
Автор
vcomp71

vcomp71

Осваивающий
Сообщения
431
Репутация
25
CreatoR сказал(а):
Прими успокоительное, никто тут никого ничем не поражает.
:IL_AutoIt_1: :rofl: :rofl:
Как не поражает? А надпись под аватаром. что я под наблюдением? Ладно, а то флуд пошел уже. Ссылку на книжку сбросил, а то вдруг кто захочет текст между заданными фрагментами вытащить и как увидит откровения от.. А тут - книжка! С книжкой-то не поспоришь! :ok:
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Vlasssov сказал(а):
(?i)<div class = "1">Ваше число .*?(\d+).*? </div>
Вот так мы получим ВСЮ строку, а надо только число... Как их исключить?

Хех, этот шаблон возвращает именно число, а не всю строку.

Код:
$sText = '<div class = "1">Ваше число 140 </div>'
$sPattern = '(?i)<div class = "1">Ваше число \d+) </div>'
$sNumber = StringRegExpReplace($sText, $sPattern, '\1')

ConsoleWrite($sNumber & @CR)


Или можно сделать более строго:

Код:
$sText = '<div class = "1">Ваше число 140 </div>'
$sPattern = '.*<div class = "1">Ваше число (\d+) </div>.*'
$sNumber = StringRegExpReplace($sText, $sPattern, '\1')
If @extended Then
	ConsoleWrite($sNumber & @CR)
EndIf


Так, что ты сам ответил на свой вопрос.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Vlasssov [?]
А надпись под аватаром. что я под наблюдением?
это я повысил уровень предупреждения, причем тоже заслуженно. почему тоже? дело в том, что все эти репутации и прочее это твое субъективное мнение, и если ты считаешь, что человек не понял твоего вопроса, то можешь ставить минусы, хоть одну хоть сто (в разумных пределах, ибо за злоупотребление тоже могут вынести предупреждение). но это мало что меняет. а вот уровень предупреждений - как только превысит определенный уровень может закрыть доступ к составлению сообщений, а при 100% и вовсе доступ к форуму, так что это не просто "медаль за отвагу", а своего рода счетчик грехов ;)

а еще, если тебе вокруг видятся оскорбления, хотя все участники высказали свое мнение, что это не так, то это больше смахивает на паранойю и патологическую мнительность. это не оскорбление, а совет - более адекватно и сдержанно подходить к вопросу.
 
Автор
vcomp71

vcomp71

Осваивающий
Сообщения
431
Репутация
25
AZJIO сказал(а):
Vlasssov
Ты не прав. То что ты назвал оскорблением на самом деле был логический вывод.
madmasles тебя в этой теме вообще не оскорблял, а вот ты его да...
Ой, модератор ошибся, а потом еще в своей ошибке упорствовать начал? Не работает его пример, а потом он вообще чушь написал, после чего началось: какой пример... Ну конечно я парсить буду html страницы в одну строку.
 
Автор
vcomp71

vcomp71

Осваивающий
Сообщения
431
Репутация
25
Kaster сказал(а):
а еще, если тебе вокруг видятся оскорбления, хотя все участники высказали свое мнение, что это не так, то это больше смахивает на паранойю и патологическую мнительность. это не оскорбление, а совет - более адекватно и сдержанно подходить к вопросу.
Я понял. Буду парсить html страницы состоящие из одной строки. И еще каскад патернов писать на каждый случай свой. Так ведь мне посоветовал участник форума с большой репутацией!
 
Автор
vcomp71

vcomp71

Осваивающий
Сообщения
431
Репутация
25
Yashied сказал(а):
Vlasssov сказал(а):
(?i)<div class = "1">Ваше число .*?(\d+).*? </div>
Вот так мы получим ВСЮ строку, а надо только число... Как их исключить?

Хех, этот шаблон возвращает именно число, а не всю строку.

Код:
$sText = '<div class = "1">Ваше число 140 </div>'
$sPattern = '.*<div class = "1">Ваше число (\d+) </div>.*'
$sNumber = StringRegExpReplace($sText, $sPattern, '\1')
If @extended Then
	ConsoleWrite($sNumber & @CR)
EndIf


Так, что ты сам ответил на свой вопрос.

Можно вообще вот так
(?s)(?i)<div class = "1">Ваше число (.*?) </div>
Если фрагменты текста ограничивающие искомый текст четко известны.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Так разве вот этот шаблон не подходит?

'.*<div class = "1">Ваше число (\d+) </div>.*'
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
OffTopic:
Vlasssov [?]
Буду парсить html страницы состоящие из одной строки.
Я не нашёл в Вашем первом сообщении ни слова о html страницах. madmasles тоже не нашёл. Garret судя по его сообщениям тоже не нашёл.

Вы будете считать нас всех дураками или всётаки признаетесь себе что плохо описали свою проблему?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Вот как я всё понял!

Vlasssov [?]
Как выбрать содержимое между двумя элементами текста, исключив эти элементы текста?Например есть выражение<div class = "1">Ваше число 140 </div>
Тут, по-моему, и первокласснику всё ясно :smile:

Соответственно между элементами текста'<div class = "1">Ваше число ' и ' </div>' находится 140 вот его и надо получить
А вот тут Vlasssov акцентирует внимание на 'и' и подтверждает наши догадки предложением
находится 140 вот его и надо получить

Далее он практически сам себе отвечает на вопрос!

(?i)<div class = "1">Ваше число .*?(\d+).*? </div>Вот так мы получим ВСЮ строку, а надо только число... Как их исключить?
Однако почему у него возвращается вся строка, остаётся (лично для меня) тайной.
Могу сказать лишь одно, если убрать *?(\d+).*? тут </div> лишний пробел то шаблон рабочий!
Кстати первым на это указал Yashied
Yashied [?]
Цитата: Vlasssov от Апрель 04, 2011, 14:09:57
(?i)<div class = "1">Ваше число .*?(\d+).*? </div>Вот так мы получим ВСЮ строку, а надо только число... Как их исключить?
Хех, этот шаблон возвращает именно число, а не всю строку.
Однако, так или иначе madmasles пытался помочь! Полагаю, что вопрос он понял так же как и я!
Но Vlasssov принял слова " Какой пример - такой ответ." за оскорбление.

madmasles [?]
Vlasssov [?]Цитата
Я ж всего лишь пример привел...
Какой пример - такой ответ.
wink.gif

Лично я тут не вижу оскорбления! Тут просто человек дал понять – "как вы написали, так я и понял!"

Теперь о "птичках".
Vlasssov вот вам пример а-ля _INetGetSource()
Код:
; А-ля _INetGetSource()
$sString = '<html>' & @CRLF & _
		   '<head>' & @CRLF & _
		   '</head>' & @CRLF & _
		   '<body>' & @CRLF & _
		   '<div class = "1">Ваше число 140           </div>' & @CRLF & _
		   '<div class = "1">Ваше число 22</div>' & @CRLF & _
		   '<div class = "1">Ваше число 345</div>' & @CRLF & _
		   '<div class = "1">Ваше число 159</div>' & @CRLF & _
		   '<ul class="box"><li>' & @CRLF & _
		   '<div class = "1">Ваше число 233</div>' & @CRLF & _
		   '<div class = "1">Ваше число           566 </div>' & @CRLF & _
		   '</li></ul>' & @CRLF & _
		   '</body>' & @CRLF & _
		   '</html>'
		   
ConsoleWrite('Резултат InetRead:' & @CRLF)
ConsoleWrite('===================================' & @CRLF)
ConsoleWrite($sString & @CRLF)
ConsoleWrite(@CRLF)
ConsoleWrite('Резултат StringRegExp' & @CRLF)
ConsoleWrite('===================================' & @CRLF)
$aNum = StringRegExp($sString, '<div class = "1">Ваше число .*?(\d+).*? </div>', 3)
For $sNum In $aNum
	ConsoleWrite('Number: -> ' & $sNum & @CRLF)
Next

Всё прекрасно работает, даже с HTML!
Уберите пробел <div class = "1">Ваше число .*?(\d+).*? тут </div> и вы получите искомый результат (все числа)!
 
Автор
vcomp71

vcomp71

Осваивающий
Сообщения
431
Репутация
25
Далее он практически сам себе отвечает на вопрос!
Однако почему у него возвращается вся строка, остаётся (лично для меня) тайной.
Garrett, я так подозреваю, что до вас дошло. Чтобы проверить регулярное выражение, я скачал утилиту

http://www.regexbuddy.com/

И написать там запрос,

(?i)(?s)<div class = "1">Ваше число .*?(\d+).*? </div>

То вместо числа он выделит в тестовом окне ПОЛНУЮ СТРОКУ, а не те символы которые стоят в круглых скобках, что собственно и послужило моему недоумению.

Естественно я и спросил - как исключить символы не проверив, как это работает в Autoit, так как регулярные выражения я не очень хорошо понимал, решил все-таки уточнить эти элементарные вещи. Всё. Неправильная работа утилиты, на которую все ссылаются, ввела меня в блуд.

Так разве вот этот шаблон не подходит?
'.*<div class = "1">Ваше число (\d+) </div>.*'
Нет.

Однако, так или иначе madmasles пытался помочь! Полагаю, что вопрос он понял так же как и я!
Но Vlasssov принял слова " Какой пример - такой ответ." за оскорбление.
То что написал madmasles в первом примере не работает. Он написал неправильное выражение. Я задал уточняющий вопрос. Более того, в его примере выдавался не массив,а ОДНО выражения, о чем мы с вами Garret вполне спокойно поговорили. А потом началось шоу. Под названием какой пример, такой и ответ, хотя я четко писал в перво сообщение не о выделении числа, это еще обсуждалось здесь.
http://autoit-script.ru/index.php?topic=2460.msg22510#msg22510
А о выделении фрагмента. Цитирую
Спасибо. Еще один вопрос. Из текста между двумя известными фрагментами, надо изъять только цифры. Цифр разно количество.
Что-то типа:
$array = StringRegExp('<test>a111</test> <test>b</test> <test>c</Test>', '<(?i)test>(.*?)</(?i)test>', 3)

Вот нужно 111 получить. Как это сделать?
И еще раз цитирую свое первое сообщение в данном форуме.

Что-то сложно мне понимаются регулярные выражения...
Простейший пример
Как выбрать содержимое между двумя элементами текста, исключив эти элементы текста?
Например есть выражение
<div class = "1">Ваше число 140 </div>
Соответственно между элементами текста
'<div class = "1">Ваше число ' и ' </div>' находится 140 вот его и надо получить

(?i)<div class = "1">Ваше число .*?(\d+).*? </div>
Вот так мы получим ВСЮ строку, а надо только число... Как их исключить?

Вы будете считать нас всех дураками или всё-таки признаетесь себе что плохо описали свою проблему?
Вы первое сообщение читали? Прочитайте еще раз. Прекращаем пафосный флуд. Лично я написал последнее сообщение в данной теме.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Vlasssov [?]
Garrett, я так подозреваю, что до вас дошло.
То, что вы не правы, давно дошло!
Вы пытаетесь себя реабилитировать, дабы не выгладить глупым, но вас, по-моему, ни кто и не считает таковым!!! Просто вам уже не один человек говорит о том, что в первом вашем вопросе не было упоминаний не о вашей "чудо" программе не о том, что вы пробовали свой шаблон именно в ней.
К тому же я вам привожу уже не первый раз конкретику вашего вопроса!
Соответственно между элементами текста
'<div class = "1">Ваше число ' и ' </div>' находится 140 вот его и надо получить
Соответственно между элементами текста
TEXT = "<div class = "1">Ваше число "
'и'
TEXT = " </div>"
находится 140
вот его и надо получить

Вы же всё время ссылаетесь на фразу
Как выбрать содержимое между двумя элементами текста, исключив эти элементы текста?
Скажите, пожалуйста, что значит в вашем понятии слово текст???
В моём понятии это набор любых символов, следовательно (из цитаты), выбирать нечего!

Ну да ладно, если вы правы, значить так тому и быть! Хотя я так не считаю!
Вот вам ещё один шаблон "Ваше\s+число\s+(\d+)(?=\b)" интересно, что в этом случае скажет regexbuddy? Если опять возвратит полную строку между тегами div, не пользуйтесь ею больше, мой вам совет!

P.S. Кстати синтаксис регулярных выражений в Autoit отличается от синтаксиса того же PERL, PHP, C+ и т.д. Это нужно учитывать, если пользуетесь сторонними утилитами.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Друзья, вы забываете, что это форум, а не чат или личная переписка. Если кто-то что-то счел за оскорбления, то пожалуйста выясняйте отношения посредством ЛС. Самый же эффективный и мудрый способ, это просто проигнорировать сообщение или больше не отвечать в этой теме. Лично мне все это было очень неприятно читать, но по долгу службы обязан.

:smile:

Все кто заслужил получили предупреждения, так что на этом ставлю точку. Кстати, Vlasssov, у тебя их уже 2, когда будет 3, ты станешь просто гостем на нашем форуме.

И еще, ты задал вопрос на форуме, и тебе люди начали помогать, именно помогать, а не давить своей репутацией. Даже, если ответ оказался совершенно глупым (заметь, с твоей точки зрения), то не нужно это воспринимать в штыки. Или уточни вопрос, или проигнорируй ответ. С большой долей вероятности, кто-нибудь другой даст более подходящий для тебя ответ. А своими высказываниями, ты отбил желание у большинства пользователей отвечать тебе, даже, если они знали ответ на твой вопрос.

А самая умная с твоей стороны фраза была

Vlasssov сказал(а):
Лично я написал последнее сообщение в данной теме.

Тема закрыта и я надеюсь, что такого больше не повторится.
 
Статус
Закрыто для дальнейших ответов.
Верх