Что нового

[Данные, строки] Оператор Switch и сравнение одного значения с несколькими,регулярные выражения

Сообщения
137
Репутация
-2
Добрый день,
Есть строка с текстом, мне нужно сравнить её по нескольким символам и выдать MsgBox при совпадении. Причём текст может быть и на несколько строк с любыми символами, мне нужно найти определённые и при первом совпадении вывести MsgBox. Не помогла мне справка шаблонов и метасимволов.
Код:
$Text = " One two three Four Five six seven "
Switch $Text
	Case "on" ; если 2 символа совпали - остальное уже не важно
		MsgBox(1024,'', 'Success')
        
	Case Else
       MsgBox(1024,'', '???')

EndSwitch

Код:
$Text = " One two three Four Five six seven "
Switch $Text
	Case "five" ; если 4 символа совпали - остальное уже не важно
		MsgBox(1024,'', 'Success')
        
	Case Else
       MsgBox(1024,'', '???')

EndSwitch
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
964
Dessan [?]
Не помогла мне справка
— А то!!!
Код:
$Text = " two three Four Five six seven "& @CRLF & _
	    " One seven Five"
If StringInStr($Text, "on") Then
   MsgBox(1024,'', 'Success')
Else
   MsgBox(1024,'', '???')
EndIf
 
Автор
D
Сообщения
137
Репутация
-2
Спасибо, а через Switch можно как-то?

И как, например, к MsgBox применить Random варианты сообщения?
 

mr.Gbabak

Осваивающий
Сообщения
252
Репутация
23
Код:
$Text = " two three Four Five six seven "& @CRLF & _
        " One seven Five"

Switch StringInStr($Text, "twu")
	Case Not @error
		MsgBox(1024,'', 'Success')
	Case Else
		MsgBox(1024,'', Random (1, 10))

EndSwitch


Dessan [?]
к MsgBox применить Random варианты сообщения?
Или как вы понимаете рандомные варианты сообщений? Бесмысленный набор букв или чтоб ответы брались из определенного списка?
 
Автор
D
Сообщения
137
Репутация
-2
Спасибо, работает, но это ж мне сколько Switch писать надо будет. Видимо, я всех запутал и неверно сформулировал мою задачу. То что в поле $Text может быть любым набором слов, цифр и знаков вообще. Мне нужно из этого $Text выявить нужные мне слова, относящиеся к одной теме и выдать по ним случайный ответ от списка. Вот вариант с функцией If...Else :
Код:
$Text = ""
If StringInStr($Text, "MST") Or StringInStr($Text, "ChOff") Or StringInStr($Text, "2ndOff") Or StringInStr($Text, "3rdOff") Or StringInStr($Text, "DCadet") Then
   MsgBox(1024,'', 'Deck Crew'); здесь Random ответ MsgBox(1024,'', 'Deck Crew') или MsgBox(1024,'', 'Deck Officers')  или MsgBox(1024,'', 'Голубятня')
ElseIf StringInStr(($Text, "CE") Or StringInStr($Text, "2ndEng") Or StringInStr($Text, "3rdEng") Or StringInStr($Text, "4thEng") Or StringInStr($Text, "ECadet") Then
   MsgBox(1024,'', 'Engine Crew'); здесь Random ответ MsgBox(1024,'', 'Engine Crew') или MsgBox(1024,'', 'Engine Officers')  или MsgBox(1024,'', 'Дыра')
ElseIf StringInStr($Text, "Твистлок")  Or StringInStr($Text, "Конус")  Then
   MsgBox(1024,'', 'Крепежи'); здесь Random ответ MsgBox(1024,'', 'Крепежи') или MsgBox(1024,'', 'Deck Fitting')
EndIf
Надеюсь, так понятней. Мне бы хотелось оптимизировать этот код и я думал, что через Switch - самый лучший вариант.
 

mr.Gbabak

Осваивающий
Сообщения
252
Репутация
23
используйте Select.


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

Код:
$Text = " two three Four Five six seven "& @CRLF & _
        " One seven Five"




Select

	Case StringInStr($Text, "two")

        MsgBox(1024,'', 'Success')


    Case StringInStr($Text, "21")

        MsgBox(1024,'', Random (1, 10))

	Case Else
		 MsgBox(1024,'', 'не найдено')


EndSelect
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
964
Dessan [?]
неверно сформулировал мою задачу
В приоритете, эта задача стоит на первом месте, после прочтения справки по autoit.

Код:
$sSource = ""
;~ $sSource = "ChOff"
;~ $sSource = "3rdEng"

$sText = " two three Four Five six ChOff seven "& @CRLF & _
	    " One seven 3rdEng Five"

Local $aAnswer[6] = ["Deck Crew", "Deck Officers", "Голубятня", _
					 "Engine Crew", "Engine Officers", "Дыра"]

$sText = StringMid($sText, StringInStr($sText, $sSource), StringLen($sSource))

Switch $sText
   Case "MST", "ChOff", "2ndOff", "3rdOff", "DCadet"
	  MsgBox(0, "", $aAnswer[Random(0,2,1)])
   Case "CE", "2ndEng", "3rdEng", "4thEng", "ECadet"
	  MsgBox(0, "", $aAnswer[Random(3,5,1)])
   Case Else
	  MsgBox(0, "", "Oops!")
EndSwitch
 
Автор
D
Сообщения
137
Репутация
-2
Любимые массивы :smile: Вот где искать надо было.
Спасибо огромное, работает.
 
A

Alofa

Гость
В догонку:
Код:
Local $sText = ' two th-ree Four Five C^E six seven ' & @CRLF & ' One seven кяоНУёС'

Local $aArray[3][2] = [['MST|ChOf*f|2ndOff|3rdOff|DCadet', 'Deck Crew|Deck Officers|Голубятня'], _
		['C^E|2ndEng|3rdEng|4thEng|ECadet', 'Engine Crew|Engine Officers|Дыра'], _
		['Твистлок|Конус|кЯонуёС', 'Крепежи|Deck Fitting']]

For $i = 0 To UBound($aArray) - 1
	$aArray[$i][0] = StringRegExpReplace($aArray[$i][0], '(?i)([^\wА-ё\s|])', '\\$1') ; Экранируем возможные метасимволы
	
;~  ;If StringRegExp($sText, $aArray[$i][0]) Then ; ............ Учитывать регистр символов
	If StringRegExp($sText, '(?i)' & $aArray[$i][0]) Then ; ... Не учитывать регистр символов
		$aAnswer = StringSplit($aArray[$i][1], '|')
		If Not @error Then MsgBox(262144, 'Ответ:', $aAnswer[Random(1, $aAnswer[0], 1)])
	EndIf
Next
 
Автор
D
Сообщения
137
Репутация
-2
To Garrett : поторопился я чуть- скрипт работает только с последним значением $sSource = "". Если ,конечно, я правильно понял как их вписывать:
Код:
$sSource = "СE"
$sSource = "ChOff"
$sSource = "3rdEng"
$sSource = "MST"
и т.д. работает только с последним значением $sSource, остальные выдают ошибку.

To Alofa работает шикарно, единственное что код :stars: У Garrett понятней намного, жаль не работает только как надо.
Но спасибо!

Попытался переделать код Garrett, чтоб работало со всеми $sSource:

Код:
$Text = "пять" ; с таким входящим текстом работает
;$Text = "пять тысяч" ; с таким входящим текстом уже не работает
Local $i = 0
Local $sSource[5] = ["раз", "два", "три", _ ;0-2
		"пять", "семь"] ;3-4
For $i = 0 To $sSource[4]

	$k = StringInStr($Text, $sSource[$i])

	If $k > 0 Then

		$Text = StringMid($Text, StringInStr($Text, $sSource[$i]), StringLen($sSource[$i]))
		ExitLoop

	ElseIf $k = 0 Then
		$i = $i + 1

	EndIf
Next

Local $aAnswer[8] = ["yes", "true", "si", "oui", _ ; 0-3
		"no", "nein", "ne", "non"] ; 4-7

Switch $Text
	Case "раз", "два", "три"
		MsgBox(0, "", $aAnswer[Random(0, 3, 1)])

	Case "пять", "семь"

		MsgBox(0, "", $aAnswer[Random(4, 7, 1)])
	Case Else
		MsgBox(0, "", "Oops!")
EndSwitch
Как я понимаю логику работы, скрипт должен сравнивать текст первого значения шаблона $sSource[$i] с входящим $Text в строке $k = StringInStr($Text, $sSource[$i]) и если находит совпадение, то переходит к
Код:
$Text = StringMid($Text, StringInStr($Text, $sSource[$i]), StringLen($sSource[$i]))
А если не находит, то переходит ко второму значению шаблона $sSource[$i] и так до тех пор пока не найдёт совпадение или не закончатся варианты. Хотя, если там 100 значений, то пока он всё отработает, пройдёт много времени.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
964
Dessan [?]
скрипт работает только с последним значением $sSource
Мой вам совет, изучите основы программирования.
[box title=Переменная]Под переменной в языках программирования понимают программный объект, имеющий имя и значение, которое может быть получено и изменено программой. Если "заглянуть" в компьютер, то переменную можно определить так:
Переменная - это имя физического участка в памяти, в котором в каждый момент времени может быть только одно значение.
Переменная - это область в оперативной памяти компьютера для хранения какой-либо информации.
Само название "переменная" подразумевает, что содержимое этого участка может изменяться.
У каждой переменной есть имя, тип и текущее значение.[/box]
 
Автор
D
Сообщения
137
Репутация
-2
Я этим и пытаюсь заниматься. Простите, а кто ж мне будет изменять мою переменную, где код для её изменения? Вот моя главная строка кода:
$sText = StringMid($sText, StringInStr($sText, $sSource), StringLen($sSource))
Насколько я понял, её задача сравнить командой StringInStr наш шаблон $sSource с вводимым текстом $sText и выявить позицию начала нашего шаблона в тексте $sText (получаем число). Затем определяем длину шаблона функцией StringLen и получаем число символов. Получаем строку вида $sText = StringMid($sText, позиция шаблона, длина шаблона). Функция StringMid извлекает нужную нам часть символов в строке, отсчитав позицию нашего шаблона и прибавив его длину, получаем новый $sText и передаём его оператору Switch.
Если я выше всё верно понял, тогда откуда скрипту каждый раз брать новое значение переменной $sSource ?Мне же нужно с чем-то сравнивать мой текст. Поэтому я и решил, что к массиву списка ответов следует добавить массив списка $sSource.
 
Автор
D
Сообщения
137
Репутация
-2
Вот доработанный вариант от Garrett уже с массивом $sSource о котором я писал выше:

Код:
$Text = "увидеть семь чудес света" ; любой текст который будет сравниваться с $sSource на наличие совпадений


Local $sSource[5] = ["раз", "два", "три", _ ;0-2
		"пять", "семь"] ;3-4
For $i = 0 To 4

	$k = StringInStr($Text, $sSource[$i])

	If $k > 0 Then

		$Text = StringMid($Text, StringInStr($Text, $sSource[$i]), StringLen($sSource[$i]))
		ExitLoop

	ElseIf $k = 0 Then
		$i = $i

	EndIf
Next

Local $aAnswer[8] = ["yes", "true", "si", "oui", _ ; 0-3
		"no", "nein", "ne", "non"] ; 4-7

Switch $Text
	Case "раз", "два", "три"
		MsgBox(0, "", $aAnswer[Random(0, 3, 1)])

	Case "пять", "семь"

		MsgBox(0, "", $aAnswer[Random(4, 7, 1)])
	Case Else
		MsgBox(0, "", "Oops!")
EndSwitch
Вроде работает ;D
 
A

Alofa

Гость
Dessan сказал(а):
... Вроде работает ;D
Тоже самое, только по проще:
Код:
$Text = "увидеть СЕМЬДЕСЯТ чудес света"

Local $sSource[5] = ["раз", "два", "три", "пять", "семь"]
For $i = 0 To 4
	If StringInStr($Text, $sSource[$i]) Then
		$Text = $sSource[$i]
		ExitLoop
	EndIf
Next

Local $aAnswer[8] = ["yes", "true", "si", "oui", "no", "nein", "ne", "non"]

Switch $Text
	Case "раз", "два", "три"
		MsgBox(0, "", $aAnswer[Random(0, 3, 1)])
	Case "пять", "семь"
		MsgBox(0, "", $aAnswer[Random(4, 7, 1)])
	Case Else
		MsgBox(0, "", "Oops!")
EndSwitch

Или:
Код:
#include <Array.au3>

Local $sText = "увидеть СЕМЬДЕСЯТ чудес света"
;~ Local $sText = "увидеть семь чудес света"

Local $sTextOut = 'Oops!', $aArray[2][2] = [['раз|два|три', 'yes|true|si|oui'], ['пять|семь', 'no|nein|ne|non']]

_ArrayDisplay($aArray, '', '', 0, Default, 'Искомые слова|Варианты ответа')

For $i = 0 To UBound($aArray) - 1
    $aArray[$i][0] = StringRegExpReplace($aArray[$i][0], '(?i)([^\wА-ё\s|])', '\\$1') ; Экранируем возможные метасимволы

;~ 	If StringRegExp($sText, '(?i)' & $aArray[$i][0]) Then ; ............ поиск слов без учета регистра
;~ 	If StringRegExp($sText, '(?i)\s' & $aArray[$i][0] & '\s') Then ; ... поиск слов целиком без учета регистра
	If StringRegExp($sText, '\s' & $aArray[$i][0] & '\s') Then ; ....... поиск слов целиком + учитывать регистр
        $aAnswer = StringSplit($aArray[$i][1], '|')
        If Not @error Then $sTextOut = $aAnswer[Random(1, $aAnswer[0], 1)]
    EndIf
Next
MsgBox(262144, 'Ответ:', $sTextOut)
 
Верх