0 / 0 / 0
Регистрация: 24.12.2013
Сообщений: 3
1

Поиск в строке со спецсимолами + $ ^

24.12.2013, 11:09. Показов 1319. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
пожалуйста помогите понять как искать в строках текста, которые содержат такие символы как + $ ^ и др.

пример:
строки $d1 и $d2
при операции сравнения они дают одинаковый результат
при поиске с "-" находит
при поиске с "+" не находит



Perl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl
 
print "Content-type: text/html\n\n";
 
$d1='s-a';
$d2='s-a';
print $d1," ",$d2,"<br>";
if ($d2 =~ m/$d1/ig){print "m//","<br>";}
if ($d2 eq $d1){print "eq","<br>";}
 
$d1='s+a';
$d2='s+a';
print $d1," ",$d2,"<br>";
if ($d2 =~ m/$d1/ig){print "m//","<br>";}
if ($d2 eq $d1){print "eq","<br>";}
 
exit;
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.12.2013, 11:09
Ответы с готовыми решениями:

Подсчитать количество вхождений буквы «о» в строке «прямой поиск в текстовой строке»
Подсчитать количество вхождений буквы «о» в строке «прямой поиск в текстовой строке» Заменить в...

Работа с массивами. Поиск наименьшего числа в строке и наибольшего в строке
Добрый вечер. Надо найти наименьшее число в строке и наибольшее в столбце. Примерно вот так...

Ввести с клавиатуры строку. Найти шаблон во введенной строке (поиск подстроки в строке)
Помогите написать программу. Ввести с клавиатуры строку. Ввести с клавиатуры коротенькую строку -...

Операции в строке: поиск, замена, удаление символа в строке
Доброго здравия! В ассемблере совсем новичок, поэтому прошу помощи. Программа должна получать...

5
174 / 170 / 19
Регистрация: 31.08.2010
Сообщений: 573
24.12.2013, 13:56 2
Эти спецсимволы нужно экранировать. Вот пример:

perl -E '$str = "s+a"; say "yes" if $str =~ /\+/'

Выводит 'yes', если в строке содержится '+'. В вашем примере лучше написать следующим образом:

Perl
1
2
3
4
5
6
7
8
9
10
11
12
#!/usr/bin/perl -w
use strict; 
use warnings;
use feature 'say';
 
my $re1 = qr/-/; # создаем объект регулярного выражения
my $str1 = 's-a';
say 'yes' if $str1 =~ /$re1/; # строка 's-a' содержит '-'
 
my $re2 = qr/\+/; # создаем объект регулярного выражения
my $str2 = 's+a';
say 'yes' if $str2 =~ /$re2/; # строка 's+a' содержит '+'
1
0 / 0 / 0
Регистрация: 24.12.2013
Сообщений: 3
24.12.2013, 19:15  [ТС] 3
спасибо за помощь
понял - что главное в этом примере акцент на экранировании спецсимволов.

проблема заключается в том что программа получает строки
в которых могут изначально содержаться спецсимволы + & и другие ..
вероятно перед поиском подстроки в ней нужно делать проверку на эти спецсимволы и защищать их экраном \
$d1=~s/\+/\\\+/ig; #в моем примере
$re2=~s/\+/\\\+/ig; #в вашем варианте

может есть какой нибудь другой способ , что бы не проверять на каждый спецсимвол по отдельности ?

рабочий вариант c + :

Perl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/perl
 
print "Content-type: text/html\n\n";
 
$d1='s-a';
$d2='s-a';
print $d1," ",$d2,"<br>";
if ($d2 =~ m/$d1/ig){print "m//","<br>";}
if ($d2 eq $d1){print "eq","<br>";}
 
$d1='s+a';
$d2='s+a';
$d1=~s/\+/\\\+/ig;      #заменяем + на \+
print $d1," ",$d2,"<br>";
if ($d2 =~ m/$d1/ig){print "m//","<br>";}
if ($d2 eq $d1){print "eq","<br>";}
 
 
exit;
0
174 / 170 / 19
Регистрация: 31.08.2010
Сообщений: 573
24.12.2013, 19:33 4
Цитата Сообщение от serg_min Посмотреть сообщение
может есть какой нибудь другой способ , что бы не проверять на каждый спецсимвол по отдельности ?
Что вы имеете ввиду? Покажите более полный пример.
Я бы не стал представлять регулярное выражение в виде строки (у вас $d1), т.к. это менее эффективно и менее наглядно, чем использование оператора qr//.
1
5981 / 1990 / 323
Регистрация: 10.12.2013
Сообщений: 6,854
25.12.2013, 07:02 5
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от serg_min Посмотреть сообщение
спасибо за помощь
понял - что главное в этом примере акцент на экранировании спецсимволов.

проблема заключается в том что программа получает строки
в которых могут изначально содержаться спецсимволы + & и другие ..
вероятно перед поиском подстроки в ней нужно делать проверку на эти спецсимволы и защищать их экраном \
$d1=~s/\+/\\\+/ig; #в моем примере
$re2=~s/\+/\\\+/ig; #в вашем варианте

может есть какой нибудь другой способ , что бы не проверять на каждый спецсимвол по отдельности ?
если проблема заключается в том, что надо искать литеральные символы в приходящей строке,

игнорируя их специальное значение в Регулярных Выражениях, то для этого существует функция

quotemeta( )., которая обэкслэшивает все ASCII символы, не относящиеся к классу слово (\w),

а именно все символы кроме [ A-Z_a-z_0-9].

Если в переменной $d1 находится строка a+s, то quotemeta($d1) вернёт a \+ s

Для работы внутри регулярного выражения можно использовать \Q и \E для обозначения начала и конца экранирования

соответственно: / \Q$d1\E /.

Есть некоторая тонкость в том, что именно экранируется, а что нет в зависимости от национального алфавита и Юникод-настроек,

но расписывать это не буду, отсылаю к документации

Perl 5 version 18.0 documentation
3
0 / 0 / 0
Регистрация: 24.12.2013
Сообщений: 3
26.12.2013, 11:30  [ТС] 6
volodin661, -
вы грамотно сформулировали мою проблему :-) и ваша подсказка " quotemeta( ) " помогла мне.
проверил - работает .

спасибо за помощь и ссылку

TheAthlete, - спасибо )
0
26.12.2013, 11:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.12.2013, 11:30
Помогаю со студенческими работами здесь

Поиск мин элемента в строке матрицы и приращение элементов в строке к нему (программа работает не правильно)
Есть матрица и функции поиска минимального элемента в строке и приращение элементов в строке к...

Поиск второго пробела в строке, функции =ПОИСК или =НАЙТИ
Всем доброго времени суток. Есть строка ул. Северная д15 и в ней необходимо определить позицию...

Поиск символа в строке. Как осуществить поиск в обратном направлении
Всем доброго времени суток. Вопрос такой: как осуществить поиск в обратном направлении, т.е. я в...

Поиск в строке
Доброго времени суток. Есть строка String s1 = &quot;42:31&quot; к примеру, входные данные всегда разные и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru