![]() |
И снова регулярные выражения
Уважаемые, спасибо за Ваше внимание вообще.
Задача в общем виде: Нужно сопоставить шаблону ЛИБО одно слово (разделение пробелом) ЛИБО все выражение в кавычках (пусть в одинарных, не суть) Чтобы все однозначно всеми понималось, пару примеров: 1) Есть текст $text = '123456 qaz qwerty'; Хочу чтобы выбралось 123456 2) Есть текст $text = "'123456 qaz' qwerty"; Хочу чтобы выбралось 123456 qaz - Без кавычек Итак, в чем основная сложность и до чего я пока додумался: 1) PHP код:
PHP код:
В первом случае номера совпадений для выражения в кавычках и для одиночного слова будут разными, порядковыми (1 и 2 соответственно), это и понятно - ведь 2 раза захватывается паттерн, два раза круглые скобки, но хочется чтобы было в одном элементе. Во втором случае элемент 1, НО, захватываются еще и сами кавычки, а хотелось бы без них (чтобы потом не анализировать это). Как их исключить там - пока не додумался. Буду благодарен свежим мыслям и конкретным решениям. |
Подниму тему.
Возможно ли найти строку НЕ содержащюю подстроку ? Что-то вида Код:
.*!(ТЕХТ).* Код:
1. Раз два три Нужно это поставить в linefilter WinMerge (там стоит автоматический NOT), для поиска измененных строк содержащих определенное слово. |
Цитата:
Попробуй поиграться с модификатором "?!", например: (?!ТвойТекст), только без всяких там ".*" - эти схавают что угодно ;) |
А по моему очень даже можно.
Крыша ^ не в самом начале означает отрицание. Получается примерно так: {(^пять)} Как вариант можно искать своё слово и потом проверять было ли совпадение: {пять} :) |
Цитата:
|
ага, я фигурные скобки с квадратными перепутал. А круглые - это группировка, внитри них всё также должно работать. Но тут они наверно вообще ничего не маняют :)
|
Цитата:
Цитата:
У меня под линухом не сработал, но чем черт не шутит? ;) |
Совесть чиста ;( .Судя по всему поиска на отсутсвие стринга не предусмотрено, так как видел предложение добавить такую опцию в "feature requests"
В круглых скобках знак ^ не имеет значения "not", только в квадратных. |
^([^a][^b][^c])*$
|
подскажие, плз, каким регулярным выражением можно "зацепить" и удалить следующие строчки
Код:
<DIV><A href="text.html" class="more">... whole issue</A></DIV> делаю так Код:
var reg = /<A href=\"[0-9a-zA-Z_\.]+\" class=\"more\">[0-9a-zA-Z_а-яА-Я\.]+<\/A>/ |
LAndrew2 на первый взгляд все верно, только пробелы не учтены, возможно что-то вроде:
Код:
var reg = /<A href=\"[0-9a-zA-Z_\.]+\" class=\"more\">.+?<\/A>/g |
вроде работает... а что означает конструкция
Код:
.+? а! вроде понял... любое кол-во символов (за исключением символа новой строки) и любое (в т.ч. нулевое) кол-во слов... |
Цитата:
|
есть задача:
1) имеется список имен файлов, все имена в определенном формате, данный формат задается пользователем, например, "%l4 - %l1 - %l2.mp3", где, например, %l1 исполнитель, %l2 - композиция, %l4 - трек 2) имеется набор файлов, все имена этих файлов также в определенном формате, заданном пользователем, например, "track %f4 %f#.mp3", где, например, %f1 исполнитель, %f2 - композиция, %f4 - трек, %f# - любые символы 3) задано, например, что файл в списке соответствует реальному файлу, если %l4=%f4 (это условие может меняться пользователем) необходимо смэтить реальные файлы с файлами в списке и показать "реальное имя -> имя в списке" для каждого файла для выполнения задачи необходимо использование регулярных выражений, для поиска соответствий необходимо заменить все выражения типа %l или %f на (.*), но чтобы потом получить и использовать значения (порядок которых может быть произвольным), надо как-то запоминать в какой позиции (.*) оказалось. потому вопрос: возможно ли значениям в скобках, типа (.*), присваивать имена и потом к ним обращаться по именам, а не по номеру в массиве? |
(?P<name>expression) если я не ошибаюсь
|
что-то такая конструкция
(?P<name>.*) не срабатывает на VBScript :( есть еще варианты? |
на http://www.regular-expressions.info/vbscript.html написано, что на VBScript изя делать так... меняй язык :)
|
is_absent,
на что? :)) а как можно сделать в VBScript? может какая-то другая конструкция есть? |
А на Java-Script тоже не работает? (это так, просто предложение попробовать, проверять нету времени)
|
Цитата:
Цитата:
|
Можно ли как то искать шаблон до определенной строки ?
Например, есть строка: PHP код:
PHP код:
|
По моему, там нет такой логики
Цитата:
|
StasK, почему нет:
PHP код:
|
а между ???
PHP код:
|
Ну и между:
PHP код:
|
Это работает только если есть единственное появление "кусок для поиска" внутри "блока". А найти второе появление искомого текста внутри такого "блока" практически никак
|
как раз и нужно искать столько "кусков для поиска" сколько встретиться.
|
Цитата:
|
Еще одно выражение
Еще одно выражение:
PHP код:
НО: не работает, а если оставить какую-нибудь одну строку, то пожалуйста :( Как это победить ? |
Собсно кто вам сказал что '$' - это прогон страницы ? Попробуй заменить на "\n"
|
Цитата:
Приведите конкретнее пример - пример текста, пример работы с ним, что делаете и какие ошибки получаете. Тогда уже можно будет что-то конкретно сказать. На каком языке-то это вообще? |
Цитата:
PHP код:
1-я строка - символ прогона страницы 2-я строка - куча пробелов, затем ===(тут какое-то число)=== 3-я строка - два пробела 4-я строка - два пробела до и после этого куска идет список: Номер пункта и наименование таких "кусков" около 1500 шт. (и убирать их ручками долговато) Цитата:
PHP код:
Цитата:
результат: пусто оставляю какое-нибудь одно условие: работает |
Ой, а мне можно тоже спросить, если у вас такая тема интересная. Уже замучался.
"Куча слов (\S+\.?\S*|\.\S+) \[\d+\]"; Прекрасно ловит фразу: "Куча слов слово [5]" (без кавычек) Но не видит фразу: "Куча слов еще слово [5]" Как сделать так, чтобы между "Куча слов " и "[5]" ловилось все, там может стоять фраза любой длины (ну порядка 20 символов) из латиницы и цифр. Спасибо. Добавил: '@(Куча слов )?([^/[]+)@' дает в [2]м результате нужное, но только если перед фразой ничего не стоит. |
Melkor,
Цитата:
примерно так ? "Куча слов ([ \w]+) \[\d+\]" А если ты хотел 2 слова, то \S+\s+\S+ StasK, "$" - это окончание строки. На одной строке может быть только 1 КОНЕЦ и уж никак не 4. Тем более что ты хочешь работать с многостроковым текстом. "символ прогона страницы" это символ FormFeed ASCII code 12? Цитата:
попробуй /\n.*?===[0-9].*?===\n \n \n/ |
Цитата:
Цитата:
Цитата:
|
FormFeed ASCII code 12 обозначается "\f"
awk вообще-то работает построчно. чтобы его заставить работать с несколькими строками нужно менять RS и FS |
Цитата:
Цитата:
|
|
Вложений: 1
Цитата:
Код:
BEGIN { |
Цитата:
а теперь: как вырезать это все ??? т.е. что бы текст, который был после этого, стал сразу за текстом который был перед блоком без пустых строк ? такое возможно? |
Часовой пояс GMT +4, время: 20:28. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.