Что нового

[RegExp] Найти пустую строку?

Alex Bit

Новичок
Сообщения
24
Репутация
0
Доброго времени суток.Рад что ресурс опять заработал.
У меня вопрос следующего содержания:
Открываем файл ТХТ.В нем находим строки не содержащие определенного слова и делаем преобразование строки -
Код:
If Not StringRegExp ($sLine, '(?i)\h*(when \w+)') Then
				  If StringRegExp ($sLine, '(?i)([a-z0-9-]+)\h*=\h*([a-z]+)') Then
			        $sRet = StringRegExpReplace($sLine, '(?i)([a-z0-9-]+)\h*=\h*([a-z]+)' , '$\1 = "\2"')
						Return $sRet
				  EndIf
		  If StringRegExp ($sLine, '(?i)([a-z0-9-]+)\h*=\h*([0-9]+)') Then
						$sRet = StringRegExpReplace($sLine, '(?i)([a-z0-9-]+)\h*=\h*([0-9]+)' , '$\1 = \2')
			Return $sRet
        EndIf
	
	EndIf

Помогите составить код чтобы он отправлял на функции:
1.Линии не содержащие ни одного слова (вертикальные "пробелы")
2.Первыми символами стоит " \\ "
3.В строке есть определенное слово(When)
4.В строке нет определенного слова(When)
5.В строке есть определенное слово(When)или(raisemax) ,но нет второго определенного слова(force)
Код:
MaxSessionHands = 10000
MaxSessionTime = 360
AutoRebuyAtUB = OFF

custom
preflop


//always play aces and kings

When (hand=AA or hand=KK)
when raises>0 raisemax force

//when re-raised, push/fold according to stacksize

when raises=1 and botslastaction=raise
when totalinvested > 50% Stacksize raisemax force
when totalinvested > 33% Stacksize and (hand=TT or hand=99 or hand=AQ) raisemax force


when others
when others fold force

flop

When totalinvested > 120% stacksize and paironboard and (bets = 1 or raises >= 1) and not (NutFullHouseOrFourOfAKind = 2  or NutFullHouseOrFourOfAKind = 1  or NutFullHouseOrFourOfAKind = 3 or NutFullHouseOrFourOfAKind = 4  or HaveQuads  or HaveStraightFlush) and (haveoverpair or have2ndoverpair or haveunderpair or havetoppair or have2ndtoppair or havetrips or havestraight or haveflush or havestraightdraw or haveflushdraw) call force



turn

When totalinvested > 120% stacksize and paironboard and (bets = 1 or raises >= 1) and not (NutFullHouseOrFourOfAKind = 2  or NutFullHouseOrFourOfAKind = 1  or NutFullHouseOrFourOfAKind = 3 or NutFullHouseOrFourOfAKind = 4  or HaveQuads  or HaveStraightFlush) and (haveoverpair or have2ndoverpair or haveunderpair or havetoppair or have2ndtoppair or havetrips or havestraight or haveflush or havestraightdraw or haveflushdraw) call force

river

When totalinvested > 120% stacksize and paironboard and (bets = 1 or raises >= 1) and not (NutFullHouseOrFourOfAKind = 2  or NutFullHouseOrFourOfAKind = 1  or NutFullHouseOrFourOfAKind = 3 or NutFullHouseOrFourOfAKind = 4  or HaveQuads  or HaveStraightFlush) and (haveoverpair or have2ndoverpair or haveunderpair or havetoppair or have2ndtoppair or havetrips or havestraight or haveflush or havestraightdraw or haveflushdraw) call force
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Alex Bit
Ты это хотел получить ?
Код:
#include<Array.au3>
$sText=ClipGet()
MsgBox(0,'$sText', $sText )
$sText=StringRegExpReplace ( $sText ,'(?://.*|.*force.*)\r\n','' )
MsgBox(0,'$sText', $sText )
$aRet=StringRegExp ( $sText ,'(?i)(.*(?:When|raisemax).*)\r\n',3 )
_ArrayDisplay($aRet)


или надо раздельно по каждому условию ?
 
Автор
A

Alex Bit

Новичок
Сообщения
24
Репутация
0
Красиво! :laugh:
Но мне надо по каждому условию.Я затем каждую строку попадающую под условие буду пере конвертировать.


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

Вопрос. Если я поменяю условие в твоем коде на -
Код:
$sText=StringRegExpReplace ( $sText ,'(?://.*|\r\n)\r\n','' )

Почему после слова - preflop сохраняется вертикальный пробел
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Alex Bit [?]
о мне надо по каждому условию

Тогда так ? :
Код:
#include<Array.au3>
$sText=ClipGet()
MsgBox(0,'$sText', $sText )
$aLine=StringSplit($sText, @CRLF,1)
_ArrayDisplay($aLine, "$aLine")
For $i=1 To UBound($aLine)-1
	If StringRegExp ( $aLine[$i] ,'^\h*$') Then MsgBox(0, "Line : " &$i , "Это пустая строка")
	If  StringRegExp ( $aLine[$i] ,'^\/\/.*$') Then MsgBox(0, "Line : " &$i , "Строка начинается с '//'"  & @CRLF & $aLine[$i] )
	If StringRegExp ( $aLine[$i] ,'(?i)^.*When.*$') Then MsgBox(0, "Line : " &$i , "В строке имеется 'When'"  & @CRLF & $aLine[$i] )
	If StringRegExp ( $aLine[$i] ,'(?i)^.*force.*$')Then ContinueLoop
	If StringRegExp ($aLine[$i] ,'(?i)^.*(When|raisemax).*$') Then MsgBox(0, "Line : " &$i , 'В строке имеется "When" или  "raisemax" и отсутствует слово : "force"' & @CRLF & $aLine[$i] )
Next
 
Автор
A

Alex Bit

Новичок
Сообщения
24
Репутация
0
Прошу прощения .Не увидел что дальше по тексту получается лажа.Мне нужно из текста убрать пустые строки и \\комментарии .Я пока не могу настроить свой мозг на мышление AutoIT(программирую микросхемы).По моему мнению алгоритм должен быть следующий:
1 Считываем строку N
если строка пустая считываем следующую строку
если строка не пустая проверяем условие есть ли слово when
если нет слова when переход на функцию обработки строки без слова when
если есть слово when то соответственно переход на обработку строки со словом when
Функция обработки строки без слова when
Если в строке присутствует знак равенства то переход на функцию равенство
Если нет то строка остается без изменения.
Функция обработки строки со словом when
Если есть слово forse то перход на функцию when&forse
Если нет то переход на функцию when not forst
В моем понимании это так.Но у вас мышление по другому.То что я делаю через задницу - это у вас в одной строчке!!! :scratch:
 
Автор
A

Alex Bit

Новичок
Сообщения
24
Репутация
0
gregaz мое вам почтение.Это просто супер.В 5 строчках уместилось , на что у меня ушло бы минимум 1\10 части "Война и мир".Буду пробовать .Возникнут вопросы отпишу или тему поставлю решонной. :ok: :IL_AutoIt_1:


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

Попробую здесь вопрос задать.(Или надо новую тему открывать)
Как я могу из массива убрать не нужные мне строки?
Мое мнение что нужно создать второй пустой массив и туда переносит нужные мне строки.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Alex Bit [?]
.По моему мнению алгоритм должен быть следующий:

Тогда это будет точно по твоемк алгоритму :
Код:
#include<Array.au3>
$sText=ClipGet()
MsgBox(0,'$sText', $sText )
$aLine=StringSplit($sText, @CRLF,1)
_ArrayDisplay($aLine, "$aLine")
For $i=1 To UBound($aLine)-1
	If StringRegExp ( $aLine[$i] ,'^\h*$') Then  ContinueLoop  ;MsgBox(0, "Line : " &$i , "Это пустая строка")
	If StringRegExp ( $aLine[$i] ,'(?i)^.*When.*$') Then
		MsgBox(0, "Line : " &$i , "В строке имеется 'When'"  & @CRLF & $aLine[$i] )
		;переход на обработку строки со словом when
		If StringInStr( $aLine[$i], "force", 2) Then 
			;====> перход на функцию when&forse
		Else
			;====>  переход на функцию when not forst
		EndIf
	Else
		MsgBox(0, "Line : " &$i , "В строке отсутствует 'When'"  & @CRLF & $aLine[$i] )
		; переход на функцию обработки строки без слова when
		If StringInStr( $aLine[$i], "=") Then 
			; ;====> переход на функцию равенство
		EndIf
	EndIf
Next

В принципе можно вообще бе Рег.выражений.(StringInStr)
Если уж использовать их, то на полную катушку (сразу для всего текста


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

Alex Bit [?]
Попробую здесь вопрос задать.(Или надо новую тему открывать)
Нужно открывать обязательно
А в принципе если задать поиск, то найдешь тему, где это подробно рассматривалось , причем с анализом скорости)
 
Автор
A

Alex Bit

Новичок
Сообщения
24
Репутация
0
Код:
$sText=StringRegExpReplace ( $sText ,'(?://.*|(?:\r\n){1,})\r\n','' )

Делает маленький косяк - между строкой "AutoRebuyAtUB = OFF" и "custom" не достает перехода на новую строку(и далее по тексту в тех местах где имеется более одной пустой строки.


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

В принципе можно вообще бе Рег.выражений.(StringInStr)
Если уж использовать их, то на полную катушку (сразу для всего текста
Хотелось бы взглянуть на подобные мысли в коде.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Alex Bit [?]
Хотелось бы взглянуть на подобные мысли в коде.

А что смотреть : ведь вопрос темы не имеет смысла
Ведь если мы находим ,что строка имеет слово скажем "When", то это уже подразумевает, что это не пустая строка
и не нужно возиться с пустой строкой:
Код:
#include<Array.au3>
$sText=ClipGet()
MsgBox(0,'$sText', $sText )
$aLine=StringSplit($sText, @CRLF,1)
_ArrayDisplay($aLine, "$aLine")
;For $i=UBound($aLine)-1 To 1 Step -1; **********Для удаления элементов массива******
For $i=1 To UBound($aLine)-1
      If StringInStr( $aLine[$i], "When", 2) Then 
        MsgBox(0, "Line : " &$i , "В строке имеется 'When'"  & @CRLF & $aLine[$i] )
        ;переход на обработку строки со словом when
        If StringInStr( $aLine[$i], "force", 2) Then 
            ;====> перход на функцию when&forse
        Else
            ;====>  переход на функцию when not forst
        EndIf
    Else
        MsgBox(0, "Line : " &$i , "В строке отсутствует 'When'"  & @CRLF & $aLine[$i] )
        ; переход на функцию обработки строки без слова when
        If StringInStr( $aLine[$i], "=") Then 
            ; ;====> переход на функцию равенство
        EndIf
    EndIf
Next


А по поводу массивов Рассмотри массив в цикле задом наперед (Step -1) и удаляй сразу не нужные элементы массива в уже процессе проверки
 
Автор
A

Alex Bit

Новичок
Сообщения
24
Репутация
0
Спасибо за содержательные ответы!!!
 
Верх