JavaScript: \ b в regex и unicode [дубликат]

Вы не можете сделать это из командной строки, вам нужно написать некоторый код (я полагаю, вы не просто ищете утилиту, в противном случае Super User может быть лучше спросить). Я также предполагаю, что ваше приложение имеет все необходимые разрешения для этого (примеры без проверки ошибок).

Hard Way

Сначала получите все потоки заданного процесса, затем вызовите SuspendThread для остановки каждого из них (и ResumeThread для возобновления). Он работает, но некоторые приложения могут сбой или зависание, потому что поток может быть остановлен в любой точке, а порядок приостановки / возобновления непредсказуем (например, это может привести к блокировке блокировки). Для однопоточного приложения это может не быть проблемой.

void suspend(DWORD processId)
{
    HANDLE hThreadSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);

    THREADENTRY32 threadEntry; 
    threadEntry.dwSize = sizeof(THREADENTRY32);

    Thread32First(hThreadSnapshot, &threadEntry);

    do
    {
        if (threadEntry.th32OwnerProcessID == processId)
        {
            HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE,
                threadEntry.th32ThreadID);

            SuspendThread(hThread);
            CloseHandle(hThread);
        }
    } while (Thread32Next(hThreadSnapshot, &threadEntry));

    CloseHandle(hThreadSnapshot);
}

Обратите внимание, что эта функция слишком много наивна, чтобы возобновлять потоки, вы должны пропустить потоки, которые были приостановлены, и легко заставить мертвых -lock из-за приостановки / возобновления заказа. Для однопоточных приложений это много, но он работает.

Недокументированный способ

Начиная с Windows XP существует NtSuspendProcess, но недокументирован . Прочитайте этот пост для примера кода (ссылка для недокументированных функций: news: //comp.os.ms-windows.programmer.win32).

typedef LONG (NTAPI *NtSuspendProcess)(IN HANDLE ProcessHandle);

void suspend(DWORD processId)
{
    HANDLE processHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processId));

    NtSuspendProcess pfnNtSuspendProcess = (NtSuspendProcess)GetProcAddress(
        GetModuleHandle("ntdll"), "NtSuspendProcess");

    pfnNtSuspendProcess(processHandle);
    CloseHandle(processHandle);
}

«Отладчик» Путь

Чтобы приостановить выполнение программы, что обычно делает отладчик, для этого вы можете использовать функцию DebugActiveProcess . Он приостановит выполнение процесса (со всеми потоками все вместе). Для возобновления работы вы можете использовать DebugActiveProcessStop.

Эта функция позволяет остановить процесс (с учетом его идентификатора процесса), синтаксис очень прост: просто передайте идентификатор процесса, который вы хотите остановить et-voila. Если вы сделаете приложение с командной строкой, вам нужно будет продолжать использовать его экземпляр, чтобы приостановить процесс (или он будет завершен). Подробные сведения см. В разделе Замечания в MSDN.

void suspend(DWORD processId)
{
    DebugActiveProcess(processId);
}

Из командной строки

Как я уже сказал, в командной строке Windows нет какой-либо полезности для этого, но вы можете вызвать функцию Windows API из PowerShell. Сначала установите скрипт Invoke-WindowsApi , после чего вы можете написать это:

Invoke-WindowsApi "kernel32" ([bool]) "DebugActiveProcess" @([int]) @(process_id_here)

Конечно, если вам это нужно, вы можете сделать для этого alias.

11
задан tgogos 24 August 2017 в 12:27
поделиться

3 ответа

Поскольку Javascript не имеет функции lookbehind, и поскольку границы слов работают только с членами класса символов \w, единственный способ - использовать группы (и захватить группы, если вы хотите сделать замену):

(?m)(^|[^a-zA-ZΆΈ-ώἀ-ῼ\n])([a-zA-ZΆΈ-ώἀ-ῼ]{2})(?![a-zA-ZΆΈ-ώἀ-ῼ])

пример для удаления двух букв:

txt = txt.replace(/(^|[^a-zA-ZΆΈ-ώἀ-ῼ\n])([a-zA-ZΆΈ-ώἀ-ῼ]{2})(?![a-zA-ZΆΈ-ώἀ-ῼ])/gm, '\1');
11
ответ дан Casimir et Hippolyte 16 August 2018 в 04:00
поделиться
  • 1
    Ваш подход наиболее близок к тому, что я хочу, но иногда удаляет линейные каналы. [Д0] (Демо) – tgogos 5 May 2014 в 21:07
  • 2
    @antithesis: действительно, см. мое редактирование, я исправил проблему. – Casimir et Hippolyte 6 May 2014 в 00:03
  • 3
    Не могли бы вы объяснить мне, что делает ^ | делать внутри 1 скобки? – tgogos 16 May 2014 в 19:24
  • 4
    @antithesis: | является специальным символом регулярного выражения и означает «OR», ^ является якорем для начала строки. Первая скобка заменяет границу слова (поскольку вы не можете использовать эту функцию с греческим алфавитом). Первая скобка означает: «начало строки ИЛИ символ, который не является буквой (греческой или латинской)». – Casimir et Hippolyte 16 May 2014 в 20:40
  • 5
    Спасибо! Я также использовал 0-9 внутри первого и третьего совпадений, потому что я удалял слова типа «2TB». или "mp3". – tgogos 17 May 2014 в 10:20

Вы можете использовать \ S

Вместо того, чтобы писать совпадение для «словных символов плюс эти символы», может быть целесообразно использовать регулярное выражение, которое не соответствует пробелу:

\S

Он шире по объему, но проще писать / использовать.

Если это слишком wide - используйте эксклюзивный список, а не список включительно:

[^\s\.]

То есть - любой символ, который не является пробелом и , а не точкой. Таким образом, также легко добавить к исключениям.

Не пытайтесь использовать \ b

Границы Word не работают с символами none-ascii , что легко продемонстрировать:

> "yay".match(/\b.*\b/)
["yay"]
> "γaγ".match(/\b.*\b/)
["a"]

Поэтому невозможно использовать \b для обнаружения слов с греческими символами - каждый символ является совпадающей границей.

Матч 2 символьные слова

Следующая комбинация может использоваться для соответствия двум символьным словам:

pattern = /(^|[\s\.,])(\S{2})(?=$|[\s\.,])/g;

(Точнее: для сопоставления двух последовательностей без пробелов).

То есть:

(^|[\s\.,]) - start of string or whitespace/punctuation (back reference 1)
(\S{2})     - two not-whitespace characters (back reference 2)
($|[\s\.,]) - end of string or whitespace/punctuation (positive lookahead)

Этот шаблон можно использовать так, чтобы удалить соответствующие слова:

"input string".replace(pattern);

Вот jsfiddle , демонстрирующие использование шаблонов в текстах в вопросе.

3
ответ дан Community 16 August 2018 в 04:00
поделиться
  • 1
    Спасибо за всю работу, которую вы сделали, но можете ли вы проверить некоторые проблемы с линейными каналами и эллипсами? DEMO – tgogos 7 May 2014 в 08:43
  • 2
    Эллипсы легко учитывать - я добавил, что перестановка ответа. для новых строк просто нужен только многострочный флаг, я проверю его позже. Казалось бы, я уже ответил на ваш другой вопрос - см. Скрипт js. – AD7six 7 May 2014 в 16:31

Попробуйте что-то вроде этого:

\s[a-zA-ZΆΈ-ώἀ-ῼ]{2}\s
1
ответ дан disklosr 16 August 2018 в 04:00
поделиться
  • 1
    не будет совпадать, если 2-буквенное слово в конце предложения или запятая, я думаю – donfuxx 4 May 2014 в 17:56
  • 2
    Ты прав. Но для простого текстового контента можно легко добавить другие символы / знаки препинания, такие как кома, (точка с запятой, точка ... – disklosr 4 May 2014 в 21:16
Другие вопросы по тегам:

Похожие вопросы: