1

Тема: AHK: Поиск номера строки и начала позиции искомой фразы

Необходимо найти номер строки и столбец, то есть начало позиции искомой фразы в текстовом файле средствами AutoHotKey.
Нюанс ещё в том что содержимое файла может быть разного наполнения, то есть это может быть код JS или PHP например в котором есть и латинские символы и русские, а также и спец символы разные и сама кодировка файлов может бить как ANSI там к UTF-8 without BOM например.

Конечный результат необходимо открыть в Notepad++

Run, "С:\Program Files\Notepad++\notepad++.exe" -n%NumString% -c%PosColumn% "%FilePath%"

2

Re: AHK: Поиск номера строки и начала позиции искомой фразы

Haystack =
(
Необходимо найти номер строки и столбец, то есть начало позиции искомой фразы в текстовом файле средствами AutoHotKey.
Нюанс ещё в том что содержимое файла может быть разного наполнения, то есть это может быть код JS или PHP например в котором есть и латинские символы и русские, а также и спец символы разные и сама кодировка файлов может бить как ANSI там к UTF-8 without BOM например.
Конечный результат необходимо открыть в Notepad++
)
needle := "ещё в том"
linePos := RegExMatch(Haystack, "O)(?:^|\R)\K\V*?(\Q" . needle . "\E)", m)
MsgBox % "pos: " . m.Pos(1) . "`n"
       . "col: " . m.Pos(1) - linePos + 1
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: Поиск номера строки и начала позиции искомой фразы

teadrinker, шаблон \Q...\E "опасно" использовать без конвертирования строки.
http://forum.script-coding.com/viewtopi … 32#p159732

4

Re: AHK: Поиск номера строки и начала позиции искомой фразы

Ха-ха, помню. Но лень каждый раз это вставлять.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Поиск номера строки и начала позиции искомой фразы

teadrinker, надо ещё номер строки находить, для переменной %NumString% в коде:

Run, "С:\Program Files\Notepad++\notepad++.exe" -n%NumString% -c%PosColumn% "%FilePath%"

6

Re: AHK: Поиск номера строки и начала позиции искомой фразы

Посчитайте, сколько переносов строк перед найденной позицией.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Поиск номера строки и начала позиции искомой фразы

teadrinker, получился такой код. Я так понимаю что используя только одно регулярное выражение RegExMatch которое сейчас в коде, позицию строки не вычислить что бы не прибегать к использованию StrLen, RegExReplace, SubStr и т.п.? Так как приветсвуется максимально короткий код, можно исключить вычисление "Позиция в тексте".

Haystack =
(
Необходимо найти номер строки и столбец, то есть начало позиции искомой фразы в текстовом файле средствами AutoHotKey.
Нюанс ещё в том что содержимое файла может быть разного наполнения, то есть это может быть код JS или PHP например в котором есть и латинские символы и русские, а также и спец символы разные и сама кодировка файлов может бить как ANSI там к UTF-8 without BOM например.
Конечный результат необходимо открыть в Notepad++
)
needle := "ещё в том"
linePos := RegExMatch(Haystack, "O)(?:^|\R)\K\V*?(\Q" . needle . "\E)", m)

if linePos {
    lineNumber := StrLen(RegExReplace(SubStr(Haystack, 1, m.Pos(1)), "[^\n]")) + 1
    colNumber := m.Pos(1) - linePos + 1
    MsgBox % "Строка: " . lineNumber . "`nПозиция в строке: " . colNumber . "`nПозиция в тексте: " . m.Pos(1)
} else {
    MsgBox "Текст не найден"
}

8

Re: AHK: Поиск номера строки и начала позиции искомой фразы

Можно и лучше обойтись без SubStr и StrLen.

Haystack =
(
Необходимо найти номер строки и столбец, то есть начало позиции искомой фразы в текстовом файле средствами AutoHotKey.
Нюанс ещё в том что содержимое файла может быть разного наполнения, то есть это может быть код JS или PHP например в котором есть и латинские символы и русские, а также и спец символы разные и сама кодировка файлов может бить как ANSI там к UTF-8 without BOM например.
Конечный результат необходимо открыть в Notepad++
)
needle := "ещё в том"
linePos := RegExMatch(Haystack, "Os)^(.*\R)?\K\V*?(\Q" . needle . "\E)", m)
needleCol := m.Pos(2) - linePos + 1
RegExReplace(m[1], "\R",, count)
needleLine := count + 1

MsgBox % "Строка: "           . needleLine . "`n"
       . "Позиция в строке: " . needleCol  . "`n"
       . "Позиция в тексте: " . m.Pos(2)

Если есть вероятность, что в искомом тексте может оказаться сочетание "\E", то так:

Haystack =
(
Необходимо найти номер строки и столбец, то есть начало позиции искомой фразы в текстовом файле средствами AutoHotKey.
Нюанс ещё \E в том что содержимое файла может быть разного наполнения, то есть это может быть код JS или PHP например в котором есть и латинские символы и русские, а также и спец символы разные и сама кодировка файлов может бить как ANSI там к UTF-8 without BOM например.
Конечный результат необходимо открыть в Notepad++
)
needle := "ещё \E в том"
linePos := RegExMatch(Haystack, "Os)^(.*\R)?\K\V*?(\Q" . literalRegex(needle) . "\E)", m)
needleCol := m.Pos(2) - linePos + 1
RegExReplace(m[1], "\R",, count)
needleLine := count + 1

MsgBox % "Строка: "           . needleLine . "`n"
       . "Позиция в строке: " . needleCol  . "`n"
       . "Позиция в тексте: " . m.Pos(2)

literalRegex(str)
{
    return RegExReplace(str, "\\E", "\E\\E\Q")
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: Поиск номера строки и начала позиции искомой фразы

teadrinker, отлично. Правда есть ещё проблемка в поиске позиции в строке, я так думаю из-за некоторых спец символов в JS коде, например:

; Путь к файлу и строка для поиска
FilePath = %A_Desktop%\admin.js

; Открыть файл для чтения
FileRead, Haystack, %FilePath%

needle := "Copied"

linePos := RegExMatch(Haystack, "Os)^(.*\R)?\K\V*?(\Q" . needle . "\E)", m)
needleCol := m.Pos(2) - linePos + 1
RegExReplace(m[1], "\R",, count)
needleLine := count + 1

MsgBox % "Строка: "           . needleLine . "`n"
       . "Позиция в строке: " . needleCol  . "`n"
       . "Позиция в тексте: " . m.Pos(2)

Содержимое JS файла в котором будет выполнятся поиск:

(function($) {
	
	// Clipboard.js
	new ClipboardJS('[data-clipboard-text]');
	$(document).on('click', '[data-clipboard-text]', function(e){
		e.preventDefault();
		var ths = $(this), text = ths.text(), width = ths.width();
		ths.css('width', width).text('Copied').addClass('copied');
		setTimeout(function(){
			ths.text(text).css('width','').removeClass('copied');
		}, 5000);
		return false;
	});
	
});

Результат, пишет что позиция в строке 33 хотя на самом деле 39.

10

Re: AHK: Поиск номера строки и начала позиции искомой фразы

Я вижу, что 33. Строка начинается с двух табов.

MsgBox % StrLen("		ths.css('width', width).text('C")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: Поиск номера строки и начала позиции искомой фразы

Точно, AHK подсчитывает правильно, это у меня Notepad++ считает два таба как 8 символов, хоть они и состоят из табов, а не из 4-х пробелов.