Что нового

Сложный поиск слова в строке

Пост номер 2 был отмечен как лучший ответ.

Vita

Новичок
Сообщения
3
Репутация
0
Всем привет!
На решение этой задачи у меня просто не хватает знаний или даже ума... Я любитель.
Просьба помочь тех кто умеет.

Задача: Есть строка в блокноте такого вида:

Корзина1 = яблоко, груша.банан Корзина2 = ананасяблоко, манго Корзина3 = вишня, яблоко.банан

-необходимо через команду
Код:
stringinstr
проверить есть ли после "Корзина3 =" слово "вишня".

То есть проверка начинается после выражения "Корзина3 =". Если "вишня" будет после "Корзина2 =" - нам это не интересно. После выражения "Корзина3 =" необходимо проверять все, даже если начнется выражение "Корзина4 =".

Слово "вишня" может находиться в любом виде- то есть это даже не слово а 5 букв подряд (вишня)
Пример ( яблоко.вишня, банан) или ( бананвишня, яблоко) - в обоих примерах мы имеем в наличии "вишня"

Как такое проверять?
 
Последнее редактирование:

sngr

AutoIT Гуру
Сообщения
981
Репутация
391
Код:
$file='Корзина1 = яблоко, груша.банан Корзина2 = ананасяблоко, манго Корзина3 = вишня, яблоко.банан'
$str=StringRegExp($file,'Корзина3 =.*?вишня',3)
If Not @error Then MsgBox(32,'','есть')
 

IMStrelcov

CTPEJIbLLOB
Сообщения
143
Репутация
22
Как вариант:
Код:
$sBaskets = 'Корзина1 = яблоко, груша.банан Корзина2 = ананасяблоко, манго Корзина3 = вишня, яблоко.банан'
$sBasket = 'Корзина3';после какой корзины искать
$sFoods = 'вишня';какой продукт искать
$iResult = FoodsExists_($sBaskets, $sBasket, $sFoods)
ConsoleWrite($iResult&@LF)

Func FoodsExists_($_sBaskets, $_sBasket, $_sFoods)
   $_sBasket = StringSplit($_sBaskets, $_sBasket, 1)
   If $_sBasket[0] < 2 Then Return 0
   If StringInStr($_sBasket[2], $_sFoods) Then Return 1
   Return 0
EndFunc

Сообщение автоматически объединено:

или
Код:
Func FoodsExists_($_sBaskets, $_sBasket, $_sFoods)
   Local $_iResult = StringInStr($_sBaskets, $_sBasket, 0, 1, 1)
   If $_iResult Then $_iResult = StringInStr($_sBaskets, $_sFoods, 0, 1, $_iResult)
   Return $_iResult
EndFunc
 
Последнее редактирование:
  • Like
Реакции: Vita
Автор
V

Vita

Новичок
Сообщения
3
Репутация
0
Всем привет!
На решение этой задачи у меня просто не хватает знаний или даже ума... Я любитель.
Просьба помочь тех кто умеет.

Задача: Есть строка в блокноте такого вида:

Корзина1 = яблоко, груша.банан Корзина2 = ананасяблоко, манго Корзина3 = вишня, яблоко.банан

-необходимо чере
Код:
stringinstr
проверить есть ли в "Корзина3" слово "вишня".

То есть проверка начинается после выражения "Корзина3 =". Если "вишня" будет в Корзина2 - нам это не интересно.

Слово "вишня" может находиться в любом виде- то есть это даже не слово а 5 букв подряд (вишня)
Пример ( яблоко.вишня, банан) или ( бананвишня, яблоко) - в обоих примерах мы имеем в наличии "вишня"

Как такое проверять?
У
Код:
$file='Корзина1 = яблоко, груша.банан Корзина2 = ананасяблоко, манго Корзина3 = вишня, яблоко.банан'
$str=StringRegExp($file,'Корзина3 =.*?вишня',3)
If Not @error Then MsgBox(32,'','есть')
Cпасибо! Работает. Коротко и четко
Сообщение автоматически объединено:

Как вариант:
Код:
$sBaskets = 'Корзина1 = яблоко, груша.банан Корзина2 = ананасяблоко, манго Корзина3 = вишня, яблоко.банан'
$sBasket = 'Корзина3';после какой корзины искать
$sFoods = 'вишня';какой продукт искать
$iResult = FoodsExists_($sBaskets, $sBasket, $sFoods)
ConsoleWrite($iResult&@LF)

Func FoodsExists_($_sBaskets, $_sBasket, $_sFoods)
   $_sBasket = StringSplit($_sBaskets, $_sBasket, 1)
   If $_sBasket[0] < 2 Then Return 0
   If StringInStr($_sBasket[2], $_sFoods) Then Return 1
   Return 0
EndFunc

Сообщение автоматически объединено:

или
Код:
Func FoodsExists_($_sBaskets, $_sBasket, $_sFoods)
   Local $_iResult = StringInStr($_sBaskets, $_sBasket, 0, 1, 1)
   If $_iResult Then $_iResult = StringInStr($_sBaskets, $_sFoods, 0, 1, $_iResult)
   Return $_iResult
EndFunc
Рабочий вариант! Спасибо!
Сообщение автоматически объединено:

Хотел еще один вопрос задать. Если подскажете - будет здорово
Как получить в переменную часть слова после определенного символа
Пример:
Имеем: 1яблоко2вишня3помидор
Что нужно:
$word = 3помидор

Все что после цифры 3 нужно взять в переменную ( вместе с цифрой 3)
 
Последнее редактирование:

IMStrelcov

CTPEJIbLLOB
Сообщения
143
Репутация
22
Код:
$sFoods = '1яблоко2вишня33огурец3помидор4груша5слива55кабачок'
$iNum = 3
$sFood = StringRegExpReplace($sFoods, '(?i).*?(\A'&$iNum&'[^0-9\h]+|(?(?<=[^0-9])(?(?=[0-9])('&$iNum&'[^0-9\h]+)))).*?', '$1')
MsgBox(0,0,$sFood)
 
  • Like
Реакции: Vita
Автор
V

Vita

Новичок
Сообщения
3
Репутация
0
Код:
$sFoods = '1яблоко2вишня33огурец3помидор4груша5слива55кабачок'
$iNum = 3
$sFood = StringRegExpReplace($sFoods, '(?i).*?(\A'&$iNum&'[^0-9\h]+|(?(?<=[^0-9])(?(?=[0-9])('&$iNum&'[^0-9\h]+)))).*?', '$1')
MsgBox(0,0,$sFood)
Спасибо! Работает.
P.S как вы вообще не путаетесть в этих выражениях???

Еще хотел уточнить - а если допустим мой разделитель будет не цифра 3 а например точка или @ что бы e-mail сортировать - работать не будет ваше
выражение?
 

IMStrelcov

CTPEJIbLLOB
Сообщения
143
Репутация
22
1. Почему не путаюсь, путаюсь, но чем дольше экспериментируешь, тем лучше. Бывает даже над сложным выражением сидишь несколько дней, пока комбинацию подберешь.
2. Нет работать не будет, выражение выше ищет только цифры в нужном кол-ве и нужного значения. Для других вариантов нужно переписывать.

И ещё, выражение выше понимает 3 и 33 и 333 и т.п. как разные числа.
 

Andrey_A

Новичок
Сообщения
106
Репутация
4
Проще и быстрее
Код:
$sFoods='1яблоко2вишня33огурец3помидор4груша5слива55кабачок'
$iNum=3
; $sFood = StringRegExpReplace($sFoods, '(?i).*?(\A'&$iNum&'[^0-9\h]+|(?(?<=[^0-9])(?(?=[0-9])('&$iNum&'[^0-9\h]+)))).*?', '$1')
$sFood=StringRegExp($sFoods,'.*(\b'&$iNum&'\D+).*|.*().*',1)[0]
MsgBox(0,0,$sFood)
 

IMStrelcov

CTPEJIbLLOB
Сообщения
143
Репутация
22
Проще и быстрее
Код:
$sFoods='1яблоко2вишня33огурец3помидор4груша5слива55кабачок'
$iNum=3
; $sFood = StringRegExpReplace($sFoods, '(?i).*?(\A'&$iNum&'[^0-9\h]+|(?(?<=[^0-9])(?(?=[0-9])('&$iNum&'[^0-9\h]+)))).*?', '$1')
$sFood=StringRegExp($sFoods,'.*(\b'&$iNum&'\D+).*|.*().*',1)[0]
MsgBox(0,0,$sFood)
Это если в названиях не использовать анг. алфавит. А так же пробел считается разделителем а не продолжением слова, у вас это не учитывается.
Вот вам вариант по короче и рабочий с любым алфавитом, говорю же, чем дольше сидеть над выражением, тем лучшую комбинацию можно получить.
Код:
$sFoods='3Coco11яблоко2вишня баклажан33огурец3помидор10Plum4груша5слива55кабачок3черешня'
$iNum=11

;тут выводит все найденные варианты номер + слово, что можно считать ошибкой т.е. 3Coco3помидор3черешня
;$sFood = StringRegExpReplace($sFoods, '(?i).*?(\A'&$iNum&'[^0-9\h]+|(?(?<=[^0-9])(?(?=[0-9])('&$iNum&'[^0-9\h]+)))).*?', '$1')

;в варианте ниже не найдет слово под цифрами 11 и 4 т.е. яблоко и груша, так как перед ними англ. слово
;$sFood=StringRegExp($sFoods,'.*(\b'&$iNum&'\D+).*|',1)[0]

;рабочий вариант, выводит первое найденое совпадение и русс. и англ слов.
$sFood = StringRegExp($sFoods, '(?:\A|.*?[\D])(('&$iNum&'[^\d\h]+))(?:.*)|', 1)[0]
;или
;$sFood = StringRegExpReplace($sFoods, '(?:\A|.*?[\D])(('&$iNum&'[^\d\h]+))(?:.*)|.*', '$1')

MsgBox(0,0,$sFood)
 
Последнее редактирование:
Верх