1

Тема: AHK: рег. выраж. в скрипте для замены прямых кавычек на кавычки-елочки

Уважаемые форумчане, я постоянно сталкиваюсь с тем, что мне необходимо менять  вот такие кавычки "ожидать", "предполагать", "намереваться", "планировать" на кавычки-елочки «ожидать», «предполагать», «намереваться», «планировать».

Я в скрипте (который вызывает окно Найти и заменить) использую регулярные выражения найти \"(\w+)\" и заменить на «$1».

Пожалуйста, помогите создать мне скрипт, который бы  находил 1-15 слов в прямых кавычках и заменял бы их на кавычки-елочки.

2

Re: AHK: рег. выраж. в скрипте для замены прямых кавычек на кавычки-елочки

Maxim, условие малопонятно. Что значит 1-15 слов? То есть, не все нужно менять? Сколько конкретно? Откуда начинать?

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

3

Re: AHK: рег. выраж. в скрипте для замены прямых кавычек на кавычки-елочки

Хорошо, приведу конкретный пример: необходимо  заменить прямые кавычки на кавычки-елочки для следующего  "ожидать, предполагать, намереваться, планировать".

То есть между прямыми кавычками может быть от 1 до 15 слов с запятыми и без запятых.

4 (изменено: equipment66, 2016-02-11 08:49:59)

Re: AHK: рег. выраж. в скрипте для замены прямых кавычек на кавычки-елочки

Maxim пишет:

"ожидать, предполагать, намереваться, планировать".

То есть между прямыми кавычками может быть от 1 до 15 слов с запятыми и без запятых.

Слова в кавычках идут отдельной строкой, в начале/в конце/с середине или по разному? Сколько пар кавычек в строке, одна или может быть больше?

5

Re: AHK: рег. выраж. в скрипте для замены прямых кавычек на кавычки-елочки

Слова в кавычках могут быть в любой части текста. Замены я делаю через окно «Найти и заменить», это окно позволяет делать замены во всех предложениях.

6

Re: AHK: рег. выраж. в скрипте для замены прямых кавычек на кавычки-елочки

Количество кавычек может быть нечётным?

7 (изменено: stealzy, 2016-02-12 23:37:05)

Re: AHK: рег. выраж. в скрипте для замены прямых кавычек на кавычки-елочки

Коллеги, анализом текста эту задачу принципиально нельзя решить однозначно.
Все просто, если воспользоваться грамматикой языка — открывающая кавычка стоит вначале текста или после пробела, за ней идет слово. Закрывающая кавычка идет после слова, но перед знаком препинания или пробелом.

string = 
(
"BOL", this is "Text here!" """ "" " "EOL"
I can do "those "things"
too, btw." end.
)
msgbox % string := RegExReplace(string, "(?<=\s|^)""(?=\w|[А-я])", "«")
msgbox % string := RegExReplace(string, "(?<=[^\s""])""(?=\W|$)", "»")

Ну и сразу функция:

ReplaceQuotesToElki(text) {
	text := RegExReplace(text, "m)(*UCP)(?<=\s|^)""(?=\w)", "«")
	text := RegExReplace(text, "m)(*UCP)(?<=[^\s""])""(?=\W|$)", "»")
	Return text
}

8

Re: AHK: рег. выраж. в скрипте для замены прямых кавычек на кавычки-елочки

Если есть уверенность, что число кавычек чётное (т. е. текст написан без ошибок), тогда просто:

text = "ожидать", "предполагать", "намереваться", "планировать"
MsgBox, % RegExReplace(text, """(.*?)""", "«$1»")

stealzy, а вот ваш пример не работает:

text = "ожидать", "предполагать", "намереваться", "планировать"

MsgBox, % ReplaceQuotesToElki(text)

ReplaceQuotesToElki(text) {
	Static EXPR := ["(?<=\s)""(?=\w)", "«", "m)^""(?=\w)", "«", "(?<=[^\s""])""(?=\W)", "»", "m)(?<=[^\s""])""$", "»"]
	loop % EXPR.MaxIndex()/2
		text := RegExReplace(text, EXPR[2*A_Index-1], EXPR[2*A_Index])
	Return text
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9

Re: AHK: рег. выраж. в скрипте для замены прямых кавычек на кавычки-елочки

А если предположить, что в слове может быть кавычка просто как литера, то можно так:

text = o"жидать, "предполагать", "пароль: a"a"a", "планировать"
MsgBox, % RegExReplace(text, "(*UCP)(?<=\s|^)""(.*?)""(?=\W|$)", "«$1»")

10 (изменено: stealzy, 2016-02-12 23:44:23)

Re: AHK: рег. выраж. в скрипте для замены прямых кавычек на кавычки-елочки

Malcev указал на опцию (*UCP), без которого юникод буквы не совпадают с \w.
Однако его вариант не сработает с вложенными кавычками.
teadrinker, исправленный вариант:

text = 
(
"Нача"ло", тут "некий текст!"  """ "" "  "конец."
Демонстрация "кавычек "в кавычках"
с переносом строки" конец.
)
MsgBox, % RegExReplace(text, "(*UCP)(?<=\s|^)""(.*?)""(?=\W|$)", "«$1»") ; Malcev
MsgBox, % ReplaceQuotesToElki(text)

ReplaceQuotesToElki(text) {
	text := RegExReplace(text, "m)(*UCP)(?<=\s|^)""(?=\w)", "«")
	text := RegExReplace(text, "m)(*UCP)(?<=[^\s""])""(?=\W|$)", "»")
	Return text
}

11

Re: AHK: рег. выраж. в скрипте для замены прямых кавычек на кавычки-елочки

[v1.0.90+]: For performance, \d, \D, \s, \S, \w, \W, \b and \B recognize only ASCII characters by default, even on Unicode builds. If the pattern begins with (*UCP), Unicode properties will be used to determine which characters match. For example, \w becomes equivalent to [\p{L}\p{N}_] and \d becomes equivalent to \p{Nd}.

https://autohotkey.com/docs/misc/RegEx-QuickRef.htm

12

Re: AHK: рег. выраж. в скрипте для замены прямых кавычек на кавычки-елочки

Спасибо!

13

Re: AHK: рег. выраж. в скрипте для замены прямых кавычек на кавычки-елочки

Есть ещё такой "атас", но вроде правильно обрабатывающий тэги, пробелы и вложенные кавычки.


text = 
(
""В русских текстах используются "ёлочки" или "лапки"."

o"жидать, "предполагать", "пароль: a"a"a", "планировать" 'gh'

""Вложенные "пары" "пары" "пары"  кавычек"  "Вложенные "пары" кавычек!" "пары" "пары" "пары" "Вложенные "пары" "пары" "пары" кавычек"
"Вложенные "пары 
"кавычек" кавычек?""
——
"Вложенные "пары 
"кавычек" кавычек!"
<p>Так вот: девушка с нормальной "психикой и не извращённым"" характером будет позитивно реагировать на рассказ об увлечениях знакомящегося с нею "пасса'''жира"; в случае же характера идиотского она будет за всё подряд его критиковать, противопоставляя ему свой собственный светлый, достойный всяческого внимания, образ. Нужно лишь навостриться выискивать в женской речи часто встречающиеся фразы типа:  "ну уж нет... ""  "А я 'э'того' не люблю", "Вот странно! А я... ", "Вот уж никогда не стала бы... ", "А вот я... ", "А ------- я... " "ну уж нет..."  "ну уж нет... "" - или что-то в этом роде, чтобы научиться ставить диагноз такой дамочке. Мой телефонный знакомый любил говаривать: "А баба - это уже диагноз". Этот критерий выглядит несколько изощрённым, но он самый точный и самый лучший. Проверено многократно.</ACRONYM></p>

"пары" "пары" ""Вложенные "пары" "пары," "пары" "пары" "пары" "пары." кавычек" <B class="hhh">jkkk</B> "Вложенные "пары" кавычек!" "пары:" "пары—" "пары"
"Вло1женные "пары кавычек кавычек!""
"Вло2женные "пары "кавычек" кавычек!""
<span title="Gh" class="Gh">n</span> "Nafa" 'Al7 Ya&#63 Min<span title="Ma" class="MS"> "пары:" "пары—" "пары"`r`n<B class="hhh">jkkk</B>"Слышат ли они<th class="22">
<span title="Gnh" class="h">n</span> Naf 'A Yakn&#363 Muin<span title="Mn" class="MS">"пары:" "пары—" "пары"`r`n<B class="hhh">jkkk</B>"Слышат ли они<th class="22">

"пары:" "пары—" "пары"`r`n<B class="hhh">
"пары:" "пары—" "пары"<B class="hhh">
"пары:" "пары—" "пары""<B class="hhh">
"пары:" "пары—" "пары"
)

loop, 10
{
      text := RegExReplace(text, "«([^«»]*)«([^«»]*)»", "«$1«$2»")
      text := RegExReplace(text, " ""([\s?\)\]\}\,\.\:\;\!\?…""'])", "n~b~s~p""$1")
      text := RegExReplace(text, "((^|[\s]|&nbsp;)([\(\[\{""]|\d+)*)([""])(\S([^""]*?|.*?\x20[""]\x20.*?)\S|[^""\s])[""]((\d+|[\)\]\}\,\.\:\;\!\?…""])*($|[\s]|&nbsp;))", "$1«$5»$7")
      text := RegExReplace(text, "n~b~s~p", " ")
      text := RegExReplace(text, "«([^«»]*)«([^«»]*)»", "«$1„$2“")

}

msgbox % text