Regex, чтобы изменить на случай предложения - PullRequest
38 голосов
/ 24 июня 2009

Я использую Notepad ++ для замены текста в языковом файле из 5453 строк. Формат строк файла:

variable.name = Variable Value Over Here, that''s for sure, Really

Двойной апостроф является преднамеренным.

Мне нужно преобразовать значение в регистр предложений, за исключением слов «Здесь» и «Действительно», которые являются правильными и должны оставаться заглавными Как вы можете видеть, регистр внутри значения обычно смешивается для начала.

Я немного поработал над этим. Все, что у меня есть, это:

 (. )([A-Z])(.+)

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

Ответы [ 4 ]

154 голосов
/ 30 мая 2013
Find:    (. )([A-Z])(.+)
Replace: \1\U\2\L\3

В Notepad ++ 6.0 или выше (который поставляется со встроенной поддержкой PCRE ).

13 голосов
/ 24 июня 2009

Замена регулярных выражений не может выполнять функцию (например, использование заглавных букв) для совпадений. Вы должны написать это, например, в PHP или JavaScript.

Обновление: См. Ответ Джонаса .

Я создал веб-страницу с именем Текстовые утилиты , чтобы делать такие вещи:

  • вставьте свой текст
  • перейдите в «Найти, отредактировать и заменить» (или нажмите Ctrl + Shift + F )
  • введите свое регулярное выражение (мое будет ^(.*?\=\s*\w)(.*)$)
  • отметьте опцию «^ $ match limit» »
  • выберите «Применить функцию JS к совпадениям»
  • добавить аргументы (сначала совпадение, затем подшаблоны), здесь s, start, rest
  • изменить оператор возврата на return start + rest.toLowerCase();

Последняя функция в текстовой области выглядит следующим образом:

return function (s, start, rest) {
     return start + rest.toLowerCase();
};

Возможно, добавьте немного кода, чтобы использовать заглавные буквы, такие как «Действительно» и «Здесь».

6 голосов
/ 20 февраля 2013

В Notepad ++ вы можете использовать плагин PythonScript для выполнения этой работы. Если вы устанавливаете плагин, создайте новый скрипт примерно так:

enter image description here

Затем вы можете использовать следующий скрипт, заменяя переменные регулярного выражения и функции по своему усмотрению:

import re

#change these
regex = r"[a-z]+sym"
function = str.upper

def perLine(line, num, total):
for match in re.finditer(regex, line):
    if match:
        s, e = match.start(), match.end()
        line = line[:s] + function(line[s:e]) + line[e:]
        editor.replaceWholeLine(num, line)

editor.forEachLine(perLine)

Этот конкретный пример работает, находя все совпадения в определенной строке, затем применяя функцию к каждому совпадению. Если вам нужна многострочная поддержка, Python Script «Conext-Help» объясняет все предлагаемые функции, включая функции pymlsearch / pymlreplace, определенные в объекте editor.

Когда вы будете готовы запустить свой скрипт, сначала перейдите к файлу, который вы хотите запустить, затем перейдите к «Сценарии>» в меню «Сценарий Python» и запустите свой.

Примечание: , хотя вы, вероятно, сможете использовать функцию отмены notepad ++, если запутаетесь, было бы неплохо сначала поместить текст в другой файл, чтобы убедиться, что он работает.

P.S. Вы можете «найти» и «пометить» каждое вхождение регулярного выражения, используя встроенный диалог поиска notepad ++, и, если бы вы могли выбрать их все, вы можете использовать функциональность TextFX «Characters-> UPPER CASE» для этой конкретной проблемы, но я Я не уверен, как перейти от отмеченного или найденного текста к выделенному тексту. Но я подумал, что опубликую это, если кто-нибудь сделает ...

Редактировать: В Notepad ++ 6.0 или выше вы можете использовать «Поиск / замена регулярных выражений PCRE (совместимых с Perl)» (источник: http://sourceforge.net/apps/mediawiki/notepad-plus/?title=Regular_Expressions) Так что это можно было бы решить с помощью регулярных выражений как (. )([A-z])(.+) с аргументом замены как \1\U\2\3.

3 голосов
/ 31 января 2015

Спрашивающий имел в виду очень конкретный случай. Как правило, «переход к предложению» в блокноте ++ первое предложение регулярного выражения не сработало для меня должным образом. хотя и не идеальный, вот измененная версия, которая было большое улучшение оригинала для моих целей:

find:    ([\.\r\n][ ]*)([A-Za-z\r])([^\.^\r^\n]+) 
replace: \1\U\2\L\3

У вас все еще есть проблема с существительными в нижнем регистре, именами, датами, странами и т. Д., Но с этим может справиться хорошая проверка орфографии.

...