2014-01-28 1 views
3

У меня есть строка рассмотретьВсего соответствие слова с неожиданной вставкой в ​​данных

my $string = 'String need to be evaluated'; 

в $string Я ищу оцененный или любое другое слово. Проблема заключается в их вставке из некоторых тегов в строку например. Str<data>ing need to be eval<data>ua<data>ted это неожиданно. В этом случае, как я мог искать слова?

вот код, который я попробовал:

my $string = 'Text to be evaluated'; 

my $string2 = "Te<data>xt need to be eval<data2>ua<data>ted"; 
# patten to match 
$pattern = "evaluated"; 

@b = split('',$pattern); 

for my $i(@b){ 
    $i="$i"."\(?:<data>\)?"; 
    print "$i#\n"; 
} 
$pattern = join('',@b); 

print "\n$pattern\n"; 

if ($string2 =~ /$pattern/){ 
    print "$pattern found\n"; 
} 

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

+1

Сначала необходимо удалить метки, затем выполнить поиск? – Qtax

+0

Нет тегов, которые содержат важную информацию. Поиск должен обрабатывать любую неожиданную вставку – waghso

+1

Итак, удалите теги на копии строки? –

ответ

1

Не уверен, если это то, что вам нужно, но как насчет

@b = split('',$pattern); 

for my $i(@b){ 
    $i=$i.".*"; 
    print "$i \n"; 
} 
$pattern = join('',@b); 

Это должно соответствовать любой строке, которая имела шаблон прежде чем он получит случайные вставки, если символы шаблона все еще существуют и находятся в правильном порядке. Он найдет evaluated в строке esouhgvw8vwrg355#*asrgl/\u[\w]atet(45)<data>efdvd, что примерно так же шумно, как и получается. Но, конечно, если невозможно отличить вставку и исходную строку, вы получите «ложные» положительные результаты. Например, если строка была evaluted, и она станет чем-то вроде evalu<hereisyourmissinga>ted, вы получите положительный результат. Конечно, если бы вы знали, что вставки всегда будут в тегах, а текст - нет, пользователи ответят гораздо безопаснее.

До тех пор, пока вы укажете свою строку ввода, символы, такие как [\ w] (45), и то, что еще не должно повредить. Я не понимаю, почему они будут интерполированы в любой момент.

+0

'$ i = $ i. '. *?';' Или '$ i = $ i. '[^] +';' Может быть лучше в этом случае. Я просто хотел знать, что их любой модуль доступен для этого экземпляра. Или любой метод или концепт, например, schwatzian tranform или что-то еще ... – waghso

+0

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

+0

@wagh Что касается Schwartz Transform и аналогичные: мне лично все равно, что только улучшает эффективность времени в Perl. Если ваша задача ограничена по времени на машине, она должна работать, не используйте Perl. Или любой язык сценариев. Мне нравится Perl, но для удобства использования и удобочитаемости (если они написаны для чтения, конечно), а не для его производительности. Для этого используйте что-то ближе к базовой системе. В моем случае C++. – DeVadder

0

Конечно, вы могли бы использовать регулярное выражение, чтобы сделать работу:

foreach my $s ($string,$string2){ 
    my $cs= $s; 
    ### canonize 
    $cs =~ s!<[^>]*>!!gs; 
    ### match 
    if ($cs =~ m!$pattern!i){ 
     print "Found $pattern in $s!\n"; 
    }   
} 
+1

Но Op явно не хочет удалять теги , Непонятно, почему, но это кажется требованием. – DeVadder

+0

Я изменил сценарий, но если это небольшое изменение не пошло для вас, тогда, пожалуйста, прочитайте. Есть много хороших книг о том, как программировать с Perl. – user1126070

+0

Большое спасибо, к счастью, я действительно могу читать. И да, это, очевидно, практический ответ. Но Op явно заявлял в комментариях, что он не хочет удалять теги, будь то в копии или нет. Конечно, не совсем понятно, почему он не хочет делать копию, удалять теги в этой копии и сопоставляться с этой копией, но было предложено, и он сказал, что это не то, что ему нужно. Не знаю, почему, только разум, который я мог представить, был бы неприлично огромными струнами, но кто знает. – DeVadder

Смежные вопросы