Что нового

Найти обратный слэш и заменить его, если слева от него четное кол-во кавычек

Sαuron

Новичок
Сообщения
45
Репутация
1
Не просто рядом, типа """"\, а вот так:
$a = ' "тратата" + "кек" \ "хахахах" ' ; в этом случае, слэш нужно заменить, т.к. слева четное кол-во кавычек " (4 шт.).
$a = ' "тратата" + "кек \ ахаахахах" ' ; а в этом заменять не надо, т.к. кол-во кавычек (3 шт.)

(Это нужно, чтоб находясь он в кавычках (являясь текстом), не заменялся, как служебный знак (операция деление))
Пытался вот так заменить
$a = stringregexpreplace($a, '(?:.*["]){1, ... даже смысла нет писать, чушь полная, еще ночь, голова не варит, я не пойму, как объяснить регулярке, что мне нужно.
 
A

Alofa

Гость
А если встретится так?
[box]$a = ' тратата" + "кек" \ ахаахахах"[/box]


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

Sαuron сказал(а):
... я не пойму, как объяснить регулярке, что мне нужно.
Почитайте на досуге вот Это.
 
Автор
S

Sαuron

Новичок
Сообщения
45
Репутация
1
Alofa сказал(а):
А если встретится так?
[box]$a = ' тратата" + "кек" \ ахаахахах"[/box]


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

Sαuron сказал(а):
... я не пойму, как объяснить регулярке, что мне нужно.
Почитайте на досуге вот Это.




Так не надо заменять, нечетное кол-во кавычек слева)


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

Вот, я пока что без регулярки решил эту задачу, обычной функцией, посмотрите, что входит и выходит. Смайлики из слэшей ВНУТРИ кавычек, остаются нетронуты. Вот нужно, чтоб это регулярка делала, хотя может и смысла в ней нет? Сильно быстрее она будет обрабатывать?

Код:
$a = '%ada%\(%ac% + 10)\2 = put(%aa%\1\2 &+ "Okay :\ :\ :\ " &+ ":\ :\ :\" &+ %ada%\1)'
$a = _var_norm($a)
consolewrite($a&@crlf)
; Ответ будет 
; %ada%<раздел>(%ac% + 10)<раздел>2 = put(%aa%<раздел>1<раздел>2 &+ "Okay :\ :\ :\ " &+ ":\ :\ :\" &+ %ada%<раздел>1)

func _var_norm($param_1)
local $f_a, $f_b, $f_c, $f_d, $f_e, $f_f

$f_a = $param_1			; Строка с которой работаем
$f_b = stringlen($f_a)	; Кол-во символов в строке
$f_c = 0				; Кол-во найденых кавычек
$f_d = ''				; Новая строка на выход

   for $i = 1 to $f_b


	  $f_e = stringleft($f_a, 1)		; Берем 1 символ

	  if $f_e = '\' and mod($f_c, 2) = 0  then
		 $f_d &= '<раздел>'						; Добавить в новую строку не обратный слэш, а его замену "<раздел>", если кол-во кавычек четное
	  else
		 $f_d &= $f_e							; Если это какой-то другой символ или слэш, но кол-во кавычек нечетное,  то добавить его же без изменений
	  endif


	  if $f_e = '"' then						;
		 $f_c += 1
	  endif
	  $f_a = stringtrimleft($f_a, 1)	; Откусываем этот символ
   next


return $f_d										
endfunc
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Код:
$sText = '%ada%\(%ac% + 10)\2 = put(%aa%\1\2 &+ "Okay :\ :\ :\ " &+ ":\ :\ :\" &+ %ada%\1)'

$pattern = '(?m)(?(DEFINE)(?<symb>\".*?\"|[^\\]))((?&symb)*?)\\'

$sRes = StringRegExpReplace($sText, $pattern, '$2<раздел>')

MsgBox(0,"",$sRes)
 
A

Alofa

Гость
C2H5OH
Код:
#include <Array.au3>
Local $sText = '"%ada%\(%ac% + 10)\2 = put(%aa%\1\2 &+ "Okay :\ :\ :\ " &+ ":\ :\ :\" &+ %ada%\1)'

$pattern = '(?m)(?(DEFINE)(?<symb>\".*?\"|[^\\]))((?&symb)*?)\\'
$sRes1 = StringRegExpReplace($sText, $pattern, '$2<раздел>')

;============== Проверочный вариант ==============================
$asText = StringSplit($sText, '"')
If @error Then Exit MsgBox(64, 'Упс', 'В строке кавычек Нет')
For $i = 1 To $asText[0] Step 2
	$asText[$i] = StringReplace($asText[$i], '\', '<раздел>')
Next
$sRes2 = _ArrayToString($asText, '"', 1)
;==================================================================
ConsoleWrite(@LF & '$sRes1 => '& $sRes1 & @LF & '$sRes2 => ' & $sRes2 & @LF)
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Alofa
поправил
Код:
#include <Timers.au3>
#include <Array.au3>

Local $sText = '"%ada%\(%ac% + 10)\2 = put(%aa%\1\2 &+ "Okay :\ :\ :\ " &+ ":\ :\ :\" &+ %ada%\1)'

$pattern = '(?m)(?(DEFINE)(?<symb>".*?"|[^"]))\G((?&symb)*?)\\'

$hStarttime = _Timer_Init()
For $t = 1 to 10000
	$sRes1 = StringRegExpReplace($sText, $pattern, '$2<раздел>')
Next
$iTime1 = _Timer_Diff($hStarttime)/1000

;============== Проверочный вариант ==============================
$hStarttime = _Timer_Init()
For $t = 1 to 10000
$asText = StringSplit($sText, '"')
If @error Then MsgBox(64, 'не Упс', 'В строке кавычек Нет,'&@CRLF&'но это не ошибка')
For $i = 1 To $asText[0] Step 2
    $asText[$i] = StringReplace($asText[$i], '\', '<раздел>')
Next
$sRes2 = _ArrayToString($asText, '"', 1)
Next
$iTime2 = _Timer_Diff($hStarttime)/1000

;==================================================================
ConsoleWrite(@LF & '$sRes1 => '& $sRes1 & @LF & '$sRes2 => ' & $sRes2 & @LF & '$iTime1 = '& $iTime1 & @LF & '$iTime2 = '& $iTime2& @LF )
 
A

Alofa

Гость
Спасибо C2H5OH огромное.
Вы буквально открыли мне глаза на "(DEFINE)" и "\G" (и еще кое на что).
Очень поучительный получился для меня ваш патерн.

Мой вариант:
Код:
#include <Timers.au3>
#include <Array.au3>

Local $sText = '"%ada%\(%ac% + 10)\2 = put(%aa%\1\2 &+ "Okay :\ :\ :\ " &+ ":\ :\ :\" &+ %ada%\1)'

$hStarttime = _Timer_Init()
For $t = 1 To 10000
;============== Вариант от Alofa ==============================
	$sRes1 = StringRegExpReplace($sText, '\G(("[^"]*?"|[^"])*?)\\', '$1<раздел>')
Next
$iTime1 = _Timer_Diff($hStarttime) / 1000

$hStarttime = _Timer_Init()
For $t = 1 To 10000
;============== Вариант от C2H5OH ==============================
	$sRes2 = StringRegExpReplace($sText, '(?m)(?(DEFINE)(?<symb>".*?"|[^"]))\G((?&symb)*?)\\', '$2<раздел>')
Next
$iTime2 = _Timer_Diff($hStarttime) / 1000

;============== Проверочный вариант ==============================
$hStarttime = _Timer_Init()
For $t = 1 To 10000
	$asText = StringSplit($sText, '"')
	If Not @error Then
		For $i = 1 To $asText[0] Step 2
			$asText[$i] = StringReplace($asText[$i], '\', '<раздел>')
		Next
		$sText = _ArrayToString($asText, '"', 1)
	EndIf
Next
$iTime3 = _Timer_Diff($hStarttime) / 1000
;==================================================================

ConsoleWrite(@LF & '[От Alofa] => ' & $sRes1 &@LF& '[От C2H5OH]=> ' & $sRes2 &@LF& '[Проверка] => ' & $sText &@LF& '$iTime1 = ' & $iTime1 &@LF& '$iTime2 = ' & $iTime2 &@LF& '$iTime3 = ' & $iTime3 & @LF)
... практически такой же, как и у вас.
 
Верх