Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Кто на регулярных выражениях собаку съел? Подскажите... / 25 сообщений из 85, страница 1 из 4
07.11.2007, 16:02
    #34922486
Automater
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто на регулярных выражениях собаку съел? Подскажите...
Надо выцепить из текста все случаи (подстроки) отвечающие следующим критериям:
1. Подстрока начинается со слова AAA
2. Подстрока заканчивается словом BBB
3. Подстрока не содержит слова ZZZ.

Вот это вот "не содержит" никак не могу спрограмить Есть возможность проверять что не содержит какие-то символы: [^z], но нужно чтобы не было конкретного слова.
...
Рейтинг: 0 / 0
07.11.2007, 16:35
    #34922729
belugin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто на регулярных выражениях собаку съел? Подскажите...
Python 2.5

(?!...)
Matches if ... doesn't match next. This is a negative lookahead assertion. For example, Isaac (?!Asimov) will match 'Isaac ' only if it's not followed by 'Asimov'.
...
Рейтинг: 0 / 0
07.11.2007, 16:37
    #34922743
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто на регулярных выражениях собаку съел? Подскажите...
Смотря какой язык используеш... У нас например есть несколько вариантов для решения п.3
Код: plaintext
1.
if $f(str,"ZZZ")= 0  w !,"Не содержится"
if str'["ZZZ" w !,"Не содержится"
и это только "основные" варианты...
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
07.11.2007, 17:22
    #34922982
qu-qu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто на регулярных выражениях собаку съел? Подскажите...
AutomaterНадо выцепить из текста все случаи (подстроки) отвечающие следующим критериям:
1. Подстрока начинается со слова AAA
2. Подстрока заканчивается словом BBB
3. Подстрока не содержит слова ZZZ.

Вот это вот "не содержит" никак не могу спрограмить Есть возможность проверять что не содержит какие-то символы: [^z], но нужно чтобы не было конкретного слова.

Ну, что-то типа так:
Код: plaintext
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.
using System;
using System.IO;
using System.Text.RegularExpressions;

public class Script {
	public static void Main (string[] args) {
		string text = @"qwerty-trewq-qwerty-werty-trewq-erty-trewq-rty";
		Regex rx = new Regex(@"-(?!tr)\w*ty"); // начинаются на "-" (минус), заканчиваются на "ty", не содержат "tr"...
     // Find matches.
     MatchCollection matches = rx.Matches(text);

     // Report the number of matches found.
     Console.WriteLine("{0} matches found.", matches.Count);

     // Report on each match.
     foreach (Match match in matches)
     {
         string word = match.Groups[0].Value;
         int index = match.Index;
         Console.WriteLine("{0} repeated at position {1}", word, index);   
     }
	}
}
//////////////// Output:

4 matches found.
-qwerty repeated at position 12
-werty repeated at position 19
-erty repeated at position 31
-rty repeated at position 42
З.Ы. курить надо т.н. (?! ) Grouping construct...
...
Рейтинг: 0 / 0
07.11.2007, 17:23
    #34922990
Green2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто на регулярных выражениях собаку съел? Подскажите...
пусть Automater скажет, на каком языке он пишет эти выражения, а то мы тут насоветуем...

--

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
07.11.2007, 17:25
    #34923002
Automater
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто на регулярных выражениях собаку съел? Подскажите...
C#.
...
Рейтинг: 0 / 0
07.11.2007, 17:30
    #34923023
Automater
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто на регулярных выражениях собаку съел? Подскажите...
Green2пусть Automater скажет, на каком языке он пишет эти выражения, а то мы тут насоветуем...хреновый!
С# - айтов в смысле регулярных...

qu-quЗ.Ы. курить надо т.н. (?! ) Grouping construct...Да допёр я до этого...
Но тут "начинается с -", частный случай. А если просто в строке не должно быть подстроки?

Код: plaintext
new Regex(@"[\S\s](?!tr)\w*ty");
Так что-ли? Пробовал я такой вариант, он один символ возращает.
...
Рейтинг: 0 / 0
07.11.2007, 17:34
    #34923046
Automater
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто на регулярных выражениях собаку съел? Подскажите...
AutomaterС# - айтов в смысле регулярных..."Ацтой" там слово.

Кароче пока мучуюсь вот так:
Expression-Based Patterns - example that matches words within a string and capitalizes them:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
static string CapText(Match m)
    {
// get the matched string
    string x = m.ToString();	
// if the first char is lower case
    if (char.IsLower(x[ 0 ]))	
// capitalize it
      return char.ToUpper(x[ 0 ]) + x.Substring( 1 , x.Length- 1 ); 
    return x;
    }
    
  static void Main()
    {
    string text = "the quick red fox jumped over the 
      lazy brown dog.";
    System.Console.WriteLine("text=[" + text + "]");
    string pattern = @"\w+";
    string result = Regex.Replace(text, pattern,
		  new MatchEvaluator(Test.CapText));
    System.Console.WriteLine("result=[" + result + "]");
    }
А там, в этой маленькой статической процедуре, уже проверяю на наличие строки.

Но это ж решение "через ж."

И вообще, после нескольких полномасштабных серфов по этому вопросу у меня создалось впечатление что в C# нельзя проверить отсутствие последовательности символов.
...
Рейтинг: 0 / 0
08.11.2007, 08:59
    #34923864
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто на регулярных выражениях собаку съел? Подскажите...
Automaterу меня создалось впечатление что в C# нельзя проверить отсутствие последовательности символов.
Отрицания еще никто не отменял Т.е. ты проверяеш "наличие", потом добавляеш к этому условию отрицание и вуаля!
Или у "насильников" такое не катит?
...
Рейтинг: 0 / 0
08.11.2007, 09:14
    #34923880
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто на регулярных выражениях собаку съел? Подскажите...
qu-quНу, что-то типа так:
Код: plaintext
1.
2.
3.
...
Regex rx = new Regex(@"-(?!tr)\w*ty");
...


наверное все таки имелось в виду:

(?! \w* tr)\w*ty

тестовый пример подобран неудачно и решение действительно частное, но не по той причине, что была озвучена. Решение первоначальной задачи:

(\bAAA\b(?!(?!.*?\bBBB\b).*?\bZZZ\b).*?\bBBB\b)

если имелись в виду не слова, а подстроки, \b убрать
но я бы делал вот так:

Код: plaintext
1.
2.
3.
4.
if (/\bAAA\b.*?(\bZZZ\b|\bBBB\b)/) {
   if ($ 1  eq 'BBB') {
      ...
   }
}

и не лохматил бабушку
...
Рейтинг: 0 / 0
08.11.2007, 10:35
    #34924096
qu-qu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто на регулярных выражениях собаку съел? Подскажите...
Gluk (Kazan) qu-quНу, что-то типа так:
Код: plaintext
1.
2.
3.
...
Regex rx = new Regex(@"-(?!tr)\w*ty");
...


наверное все таки имелось в виду:

(?! \w* tr)\w*ty
...
Да, вы правы, именно это и имелось ввиду, прошу прощения у топиккастера за некоторую небрежность в тестовом примере, однако ж, я честно в З.Ы. сказал, что "курить" надо именно Grouping construct, а не ждать от посетителей форума готовых решений... (у отвечающего, банально, может не хватать времени, чтобы проверять досконально основную идею ответа).
...
Рейтинг: 0 / 0
09.11.2007, 11:18
    #34927383
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто на регулярных выражениях собаку съел? Подскажите...
Gluk (Kazan)
(\bAAA\b(?!(?!.*?\bBBB\b).*?\bZZZ\b).*?\bBBB\b)


мда. поторопился
это тоже не работает. Проблема в том, что при неуспешном сопоставлении поиск не останавливается, а продолжается дальше :(

Вот это теоретически должно работать:

Код: plaintext
1.
/\bAAA\b(.*?)\bBBB\b(?(?{ $ 1  =~ \/\bZZZ\b\/ })\ 0 )/

Идея думаю понятна :)
К сожалению, у меня оно валит Perl

P.S. В моей самописной машинке регулярных выражений эта задачка решается элементарно, так как я добавил в квантификатор возможность задания стоп-выражения
P.P.S. Замечание относительно лохматой бабушки остается в силе, такого рода задачи проще решаются вне стандартного регулярного выражения
...
Рейтинг: 0 / 0
09.11.2007, 13:16
    #34927963
Automater
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто на регулярных выражениях собаку съел? Подскажите...
Gluk (Kazan)К сожалению, у меня оно валит Perl нужен с#
...
Рейтинг: 0 / 0
09.11.2007, 13:20
    #34927989
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто на регулярных выражениях собаку съел? Подскажите...
Automater Gluk (Kazan)К сожалению, у меня оно валит Perl нужен с#

внимательно читай про бабушку, остальное игра ума
эта задачка не для регекспов
...
Рейтинг: 0 / 0
09.11.2007, 13:25
    #34928022
Automater
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто на регулярных выражениях собаку съел? Подскажите...
Gluk (Kazan) Automater Gluk (Kazan)К сожалению, у меня оно валит Perl нужен с#

внимательно читай про бабушку, остальное игра ума
эта задачка не для регексповWho is missis Babushka?

Я много серфил. Создалось впечатление что нету никаких отрицаний целых подстрок .
...
Рейтинг: 0 / 0
09.11.2007, 13:42
    #34928115
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто на регулярных выражениях собаку съел? Подскажите...
Gluk (Kazan)
Код: plaintext
1.
2.
3.
4.
if (/\bAAA\b.*?(\bZZZ\b|\bBBB\b)/) {
   if ($ 1  eq 'BBB') {
      ...
   }
}

и не лохматил бабушку
...
Рейтинг: 0 / 0
09.11.2007, 14:50
    #34928470
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто на регулярных выражениях собаку съел? Подскажите...
AutomaterСоздалось впечатление что нету никаких отрицаний целых подстрок .
У нас в Cache проверка по шаблону возвращает:
0 - ложь
1 - истина
если подставить отрицание к выражению "содержит" - получим "не содержит" Хотя в этом не нужны регулярные выражения... У нас есть такая бинарная операция "содержит"
Код: plaintext
1.
2.
3.
4.
if str["ZZZ" {
   w !,"Содержит"
} else {
   w !,"Не содержит"
}
...
Рейтинг: 0 / 0
09.11.2007, 15:14
    #34928587
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто на регулярных выражениях собаку съел? Подскажите...
krvsa AutomaterСоздалось впечатление что нету никаких отрицаний целых подстрок .
У нас в Cache проверка по шаблону возвращает:
0 - ложь
1 - истина
если подставить отрицание к выражению "содержит" - получим "не содержит" Хотя в этом не нужны регулярные выражения... У нас есть такая бинарная операция "содержит"
Код: plaintext
1.
2.
3.
4.
if str["ZZZ" {
   w !,"Содержит"
} else {
   w !,"Не содержит"
}


Я конечно понимаю, что у кашистов принято называть регулярными выражениями все что угодно кроме регулярных выражений, но автор явно сказал, что его интересует C#
...
Рейтинг: 0 / 0
09.11.2007, 15:40
    #34928700
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто на регулярных выражениях собаку съел? Подскажите...
Про отрицание писал я, вот и отписался...
----------
Cache for Windows NT (Intel) 5.0.20 (Build 6305) Fri Sep 16 2005 11:54:10 EDT
...
Рейтинг: 0 / 0
09.11.2007, 18:22
    #34929291
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто на регулярных выражениях собаку съел? Подскажите...
AutomaterЯ много серфил. Создалось впечатление что нету никаких отрицаний целых подстрок .Вообще-то отрицания есть. Только с ними работать сложно :)
Если на время отвлечешься от C# и почитаешь perlre, там есть глава под названием Backtracking. И там с примерами объясняется как работает движок регулярных выражений и почему AAA.*(?!ZZZ) работает не так как ожидалось.
А вообще, отрицание можно сделать двумя способами. Через (?!word) или (word){0}.
...
Рейтинг: 0 / 0
09.11.2007, 18:27
    #34929310
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто на регулярных выражениях собаку съел? Подскажите...
если так? Не проверял.
AAA(?:[^BZ]*(?!ZZZ)Z*)+BBB
...
Рейтинг: 0 / 0
12.11.2007, 08:20
    #34931190
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто на регулярных выражениях собаку съел? Подскажите...
maXmoесли так? Не проверял.
AAA(?:[^BZ]*(?!ZZZ)Z*)+BBB

частное решение [^BZ]
...
Рейтинг: 0 / 0
12.11.2007, 08:22
    #34931194
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто на регулярных выражениях собаку съел? Подскажите...
White Owlили (word){0}.

Гмм. всегда считал, что сие совпадет с пустой строкой, стало быть найдется в любой строке
...
Рейтинг: 0 / 0
12.11.2007, 10:18
    #34931387
Tellur
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто на регулярных выражениях собаку съел? Подскажите...
я делал так
Код: plaintext
1.
/([^v]|v(?!asia))+/
...
Рейтинг: 0 / 0
12.11.2007, 18:25
    #34933461
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кто на регулярных выражениях собаку съел? Подскажите...
Gluk (Kazan) White Owlили (word){0}.

Гмм. всегда считал, что сие совпадет с пустой строкой, стало быть найдется в любой строкеОшибался :)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
#!/usr/bin/perl
$a = "wqeAAAZZZZBBBasdffg";
$b = "wqeAAAZZBBBasdffg";
$c = "wqeAAABBBasdffg";

$pattern = "AAA(ZZZ){0}BBB";

print "\$a - Yes\n" if ($a =~ $pattern);
print "\$b - Yes\n" if ($b =~ $pattern);
print "\$c - Yes\n" if ($c =~ $pattern);
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Кто на регулярных выражениях собаку съел? Подскажите... / 25 сообщений из 85, страница 1 из 4
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]