Перейти к содержимому

  • 2 Страниц +
  • 1
  • 2

Возможно, тока regexp меня спасет

- взять подстроку из текста в C#
  • сержант пользователь
  • PipPipPip
  • Вставить ник
  • Цитировать
  • Группа: Пользователи
  • Сообщений: 2 449

вобщем, надо найти подстроку начинающуюся (пример) с abc по середине любые символы, а заканчивается на xyz, причем, abc и xyz в конечную выборку не входят...
Единственный выход насколько я понимаю это регулярные выражения, но я ими не пользовался раньше, и въехать как ето сделать немогу. мож кто поможет?

ps благодаря общим усилиям решение найдено (?<=ABC)(.*)(?=XYZ)

программа для "регулярок" http://www.ultrapico.com/ - Expresso (thanks NEF)(free, but registration needed)
так же онлайн сайтик http://myregexp.com/ (thanks yayaboom)

Сообщение отредактировал pred: 30.06.2009 - 20:49

Автогубитель
  • 1

  • Наномеханик
  • PipPip
  • Вставить ник
  • Цитировать
  • Группа: Пользователи
  • Сообщений: 707

я бы велосипед изобретал))
перебираешь строку в цикле от начала до конца ищешь последовательность abc если нашлось начинаешь копировать последующие символы во временную переменную а если ещё и xyz нашёлся то возвращаешь эту временную переменную а если нет то код ошибки

Сообщение отредактировал azt59: 05.06.2009 - 11:33

  • -2

  • ken kashiko
  • PipPip
  • Вставить ник
  • Цитировать
  • Группа: Пользователи
  • Сообщений: 214

QUOTE (azt59 @ 05 июня 2009, 11:32)
я бы велосипед изобретал))

Хороший Вы наверное софт пишете :)

По теме, регулярное выражение будет наверное таким: abc.*xyz
Counted Linux User: http://counter.li.org/cgi-bin/runscript/display-person.cgi?user=493113

Мне свойственно ошибаться.
  • 0

  • рядовой пользователь
  • PipPip
  • Вставить ник
  • Цитировать
  • Группа: Пользователи
  • Сообщений: 455

QUOTE (Sage @ 05 июня 2009, 11:51)
Хороший Вы наверное софт пишете :)

По теме, регулярное выражение будет наверное таким: abc.*xyz

abc(.*)xyz

чтобы abc и xyz в результат не входили
Вечная жизнь вершится здесь и сейчас
  • 0

  • ken kashiko
  • PipPip
  • Вставить ник
  • Цитировать
  • Группа: Пользователи
  • Сообщений: 214

QUOTE (Chak @ 05 июня 2009, 12:28)
abc(.*)xyz

чтобы abc и xyz в результат не входили

Точно :) Не внимательно условие прочитал :)
Counted Linux User: http://counter.li.org/cgi-bin/runscript/display-person.cgi?user=493113

Мне свойственно ошибаться.
  • 0

  • сержант пользователь
  • PipPipPip
  • Вставить ник
  • Цитировать
  • Группа: Пользователи
  • Сообщений: 2 449

QUOTE (Chak @ 05 июня 2009, 12:28)
abc(.*)xyz

чтобы abc и xyz в результат не входили

подскажите, а если между abc и xyz будут символы перевода строки, или ещо какие хитрые символы? сработает? а то чтото 0 совпадений говорит..............

Сообщение отредактировал pred: 05.06.2009 - 15:58

Автогубитель
  • 0

  • ken kashiko
  • PipPip
  • Вставить ник
  • Цитировать
  • Группа: Пользователи
  • Сообщений: 214

QUOTE (pred @ 05 июня 2009, 15:57)
подскажите, а если между abc и xyz будут символы перевода строки, или ещо какие хитрые символы? сработает? а то чтото 0 совпадений говорит..............

Попробовал только что с переводом строки и табуляцией - работает
Counted Linux User: http://counter.li.org/cgi-bin/runscript/display-person.cgi?user=493113

Мне свойственно ошибаться.
  • 0

  • рядовой пользователь
  • PipPip
  • Вставить ник
  • Цитировать
  • Группа: Пользователи
  • Сообщений: 282

поищи такую книгу в интернете ...
И более-менее регулярки изучишь , и быстрее будет , чем ответы ждать
Возможно там что-то есть
-------------------------------------
Проекты на платформе 1С:
www.rt-finance.ru
  • 0

  • сержант пользователь
  • PipPipPip
  • Вставить ник
  • Цитировать
  • Группа: Пользователи
  • Сообщений: 2 449

gavrik наверное прав. Всем спасибо за помощь
Автогубитель
  • 0

  • [удалено администрацией г.Перми]
  • PipPipPipPipPip
  • Вставить ник
  • Цитировать
  • Группа: Пользователи
  • Сообщений: 5 783

http://myregexp.com/
удобно тестить регулярки..
вставляете кусок текста и подгоняете выражение..
сразу все видно..
Не приписывайте мне ваши глупые мысли..
  • 0

  • Agile Coach
  • PipPipPipPipPip
  • Вставить ник
  • Цитировать
  • Группа: Донатор
  • Сообщений: 8 231

Используйте программу regexp buddy как для отладки регулярного выражения, так и для автоматической генерации кода, C#, насколько помню, поддерживается.
  • 0

  • сержант пользователь
  • PipPipPip
  • Вставить ник
  • Цитировать
  • Группа: Пользователи
  • Сообщений: 2 449

мм если html загнать в string, в этом html`e который в стринге могут быть какие нить "концы строк" для регулярного выражения? ну например какой нить перевод строки или еще какой символ?
у меня просто ощущение что он видит какие то концы строк в строке, а так вроде работает...
Автогубитель
  • 0

  • [удалено администрацией г.Перми]
  • PipPipPipPipPip
  • Вставить ник
  • Цитировать
  • Группа: Пользователи
  • Сообщений: 5 783

QUOTE (Гуинплен @ 05 июня 2009, 18:01)
regexp buddy

единственная вменяемая программа для работы с регулярками..
вот только платная..
Не приписывайте мне ваши глупые мысли..
  • 0

  • рядовой пользователь
  • PipPip
  • Вставить ник
  • Цитировать
  • Группа: Пользователи
  • Сообщений: 455

QUOTE (pred @ 06 июня 2009, 10:14)
мм если html загнать в string, в этом html`e который в стринге могут быть какие нить "концы строк" для регулярного выражения? ну например какой нить перевод строки или еще какой символ?
у меня просто ощущение что он видит какие то концы строк в строке, а так вроде работает...

Перевод строки такой же символ (или символы, если двухбайтовый код используется), как и любой другой и также может присутствовать в строке. И в регулярном выражении обрабатывается как и все остальные. И что значит "видит какие то концы"? Понятно объясняйте.
Вечная жизнь вершится здесь и сейчас
  • 0

  • сержант пользователь
  • PipPipPip
  • Вставить ник
  • Цитировать
  • Группа: Пользователи
  • Сообщений: 2 449

QUOTE (Chak @ 09 июня 2009, 12:46)
Перевод строки такой же символ (или символы, если двухбайтовый код используется), как и любой другой и также может присутствовать в строке. И в регулярном выражении обрабатывается как и все остальные. И что значит "видит какие то концы"? Понятно объясняйте.

QUOTE
Точка. Соответствует любому знаку, кроме \n.
http://msdn.microsof...y/20bw873z.aspx

вот строка
abc(.*)xyz

почти получилось кстати, но почему то abc(.*)xyz возвращает abcИСКОМЫЙТЕКСТxyz

Сообщение отредактировал pred: 11.06.2009 - 16:43

Автогубитель
  • 0

  • рядовой пользователь
  • PipPip
  • Вставить ник
  • Цитировать
  • Группа: Пользователи
  • Сообщений: 455

QUOTE
Точка. Соответствует любому знаку, кроме \n.


Нюансов майкросовтовской реализации я, к сожалению, не знаю. Но, судя по описанию, можно использовать параметр Singleline, чтобы исключить влияние \n.

QUOTE
почти получилось кстати, но почему то abc(.*)xyz возвращает abcИСКОМЫЙТЕКСТxyz


Ну это смотря какие методы вы используете. Нашел там же в msdn в примерах такое (Извлечение протокола и номера порта из URL-адреса, для C#):

CODE

string url = "http://www.contoso.com:8080/letters/readme.html";

Regex r = new Regex(@"^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/",
                   RegexOptions.Compiled);
Console.WriteLine(r.Match(url).Result("${proto}${port}"));
// The example displays the following output:
//       http:8080


может в этом направлении покопать?

Сообщение отредактировал Chak: 15.06.2009 - 10:24

Вечная жизнь вершится здесь и сейчас
  • 0

  • почтенный теронозавр
  • PipPipPipPip
  • Вставить ник
  • Цитировать
  • Группа: Пользователи
  • Сообщений: 2 770

QUOTE (yayaboom @ 06 июня 2009, 21:32)
единственная вменяемая программа для работы с регулярками..
вот только платная..

Expresso, IMHO, лучше -- нет "затыков" (иногда RegexBuddy подвисает на несколько минут) + бесплатная.
Эмигрант.
  • 1

  • сержант пользователь
  • PipPipPip
  • Вставить ник
  • Цитировать
  • Группа: Пользователи
  • Сообщений: 2 449

спасибо благодаря этой программе родился конечный вариант (?<=ABC)(.*)(?=XYZ)
Автогубитель
  • 0

  • недавно на форуме
  • Pip
  • Вставить ник
  • Цитировать
  • Группа: Отключенные
  • Сообщений: 26

QUOTE (pred @ 30 июня 2009, 20:40)
спасибо благодаря этой программе родился конечный вариант (?<=ABC)(.*)(?=XYZ)

А если в строке несколько пар ABC и XYZ, то точно сработает?
Например, для текста
testABCtestXYZtestABCtestXYZtest
при обычном жадном сопоставлении с образцом будет выдано не два вхождения test, а одно вхождение testXYZtestABCtest.

Если это так, то лучше заменить .* на нежадный вариант .*? , т.е.
(?<=ABC)(.*?)(?=XYZ)

  • 0

  • недавно на форуме
  • Pip
  • Вставить ник
  • Цитировать
  • Группа: Отключенные
  • Сообщений: 26

Ещё одна проблема может возникнуть со строкой вида
ABCABCXYZ

Этот паттерн выдаст два вхождения: "ABC" и "". На мой взгляд, логичнее был бы, если б он выдал только "ABC", хотя, возможно, вам так и надо.
Вообще, я бы использовал паттерн
ABC(.*?)XYZ
а от найденных строк отсекал префикс длиной length("ABC") и суффикс длиной length("XYZ").

добавлено в [mergetime]1246384495[/mergetime]

QUOTE (azt59 @ 05 июня 2009, 11:32)
я бы велосипед изобретал))
перебираешь строку в цикле от начала до конца ищешь последовательность abc если нашлось начинаешь копировать последующие символы во временную переменную а если ещё и xyz нашёлся то возвращаешь эту временную переменную а если нет то код ошибки

Чем людям не нравится вариант парсить вручную без регулярок? Пишется он достаточно просто. Вот тест на C#, который показывает, что и работает он на 30% быстрее: http://rem.pastebin.com/f15a57d8d
  • 0

  • 2 Страниц +
  • 1
  • 2

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей