This commit is contained in:
Jane
2024-07-16 15:55:31 +08:00
parent 8f4ec86367
commit 29bc31ade5
12411 changed files with 8139339 additions and 0 deletions

View File

@@ -0,0 +1,119 @@
import uno
import unohelper
import lightproof_opts_ru_RU
from lightproof_impl_ru_RU import pkg
from com.sun.star.lang import XServiceInfo
from com.sun.star.awt import XContainerWindowEventHandler
# options
options = {}
def load(context):
try:
l = LightproofOptionsEventHandler(context)
for i in lightproof_opts_ru_RU.lopts:
l.load(i)
except:
pass
def get_option(page, option):
try:
return options[page + "," + option]
except:
try:
return options[page[:2] + "," + option]
except:
return 0
def set_option(page, option, value):
options[page + "," + option] = int(value)
class LightproofOptionsEventHandler( unohelper.Base, XServiceInfo, XContainerWindowEventHandler ):
def __init__( self, ctx ):
p = uno.createUnoStruct( "com.sun.star.beans.PropertyValue" )
p.Name = "nodepath"
p.Value = "/org.openoffice.Lightproof_%s/Leaves"%pkg
self.xConfig = ctx.ServiceManager.createInstance( 'com.sun.star.configuration.ConfigurationProvider' )
self.node = self.xConfig.createInstanceWithArguments( 'com.sun.star.configuration.ConfigurationUpdateAccess', (p, ) )
self.service = "org.libreoffice.comp.pyuno.LightproofOptionsEventHandler." + pkg
self.ImplementationName = self.service
self.services = (self.service, )
# XContainerWindowEventHandler
def callHandlerMethod(self, aWindow, aEventObject, sMethod):
if sMethod == "external_event":
return self.handleExternalEvent(aWindow, aEventObject)
def getSupportedMethodNames(self):
return ("external_event", )
def handleExternalEvent(self, aWindow, aEventObject):
sMethod = aEventObject
if sMethod == "ok":
self.saveData(aWindow)
elif sMethod == "back" or sMethod == "initialize":
self.loadData(aWindow)
return True
def load(self, sWindowName):
child = self.getChild(sWindowName)
for i in lightproof_opts_ru_RU.lopts[sWindowName]:
sValue = child.getPropertyValue(i)
if sValue == '':
if i in lightproof_opts_ru_RU.lopts_default[sWindowName]:
sValue = 1
else:
sValue = 0
set_option(sWindowName, i, sValue)
def loadData(self, aWindow):
sWindowName = self.getWindowName(aWindow)
if (sWindowName == None):
return
child = self.getChild(sWindowName)
for i in lightproof_opts_ru_RU.lopts[sWindowName]:
sValue = child.getPropertyValue(i)
if sValue == '':
if i in lightproof_opts_ru_RU.lopts_default[sWindowName]:
sValue = 1
else:
sValue = 0
xControl = aWindow.getControl(i)
xControl.State = sValue
set_option(sWindowName, i, sValue)
def saveData(self, aWindow):
sWindowName = self.getWindowName(aWindow)
if (sWindowName == None):
return
child = self.getChild(sWindowName)
for i in lightproof_opts_ru_RU.lopts[sWindowName]:
xControl = aWindow.getControl(i)
sValue = xControl.State
child.setPropertyValue(i, str(sValue))
set_option(sWindowName, i, sValue)
self.commitChanges()
def getWindowName(self, aWindow):
sName = aWindow.getModel().Name
if sName in lightproof_opts_ru_RU.lopts:
return sName
return None
# XServiceInfo method implementations
def getImplementationName (self):
return self.ImplementationName
def supportsService(self, ServiceName):
return (ServiceName in self.services)
def getSupportedServiceNames (self):
return self.services
def getChild(self, name):
return self.node.getByName(name)
def commitChanges(self):
self.node.commitChanges()
return True

View File

@@ -0,0 +1,236 @@
# -*- encoding: UTF-8 -*-
import uno, re, sys, os, traceback
from com.sun.star.text.TextMarkupType import PROOFREADING
from com.sun.star.beans import PropertyValue
pkg = "ru_RU"
lang = "ru_RU"
locales = {'ru-RU': ['ru', 'RU', '']}
version = "0.3.4"
author = "Yakov Reztsov <yr at myooo dot ru>"
name = "Lightproof grammar checker (Russian)"
import lightproof_handler_ru_RU
# loaded rules (check for Update mechanism of the editor)
try:
langrule
except NameError:
langrule = {}
# ignored rules
ignore = {}
# cache for morphogical analyses
analyses = {}
stems = {}
suggestions = {}
# assign Calc functions
calcfunc = None
# check settings
def option(lang, opt):
return lightproof_handler_ru_RU.get_option(lang.Language + "_" + lang.Country, opt)
# filtering affix fields (ds, is, ts etc.)
def onlymorph(st):
if st != None:
st = re.sub(r"^.*(st:|po:)", r"\\1", st) # keep last word part
st = re.sub(r"\\b(?=[dit][sp]:)","@", st) # and its affixes
st = re.sub(r"(?<!@)\\b\w\w:\w+","", st).replace('@','').strip()
return st
# if the pattern matches all analyses of the input word,
# return the last matched substring
def _morph(rLoc, word, pattern, all, onlyaffix):
global analyses
if not word:
return None
if word not in analyses:
x = spellchecker.spell(u"<?xml?><query type='analyze'><word>" + word + "</word></query>", rLoc, ())
if not x:
return None
t = x.getAlternatives()
if not t:
if not analyses: # fix synchronization problem (missing alternatives with unloaded dictionary)
return None
t = [""]
analyses[word] = t[0].split("</a>")[:-1]
a = analyses[word]
result = None
p = re.compile(pattern)
for i in a:
if onlyaffix:
i = onlymorph(i)
result = p.search(i)
if result:
result = result.group(0)
if not all:
return result
elif all:
return None
return result
def morph(rLoc, word, pattern, all=True):
return _morph(rLoc, word, pattern, all, False)
def affix(rLoc, word, pattern, all=True):
return _morph(rLoc, word, pattern, all, True)
def spell(rLoc, word):
if not word:
return None
return spellchecker.isValid(word, rLoc, ())
# get the tuple of the stem of the word or an empty array
def stem(rLoc, word):
global stems
if not word:
return []
if not word in stems:
x = spellchecker.spell(u"<?xml?><query type='stem'><word>" + word + "</word></query>", rLoc, ())
if not x:
return []
t = x.getAlternatives()
if not t:
t = []
stems[word] = list(t)
return stems[word]
# get the tuple of the morphological generation of a word or an empty array
def generate(rLoc, word, example):
if not word:
return []
x = spellchecker.spell(u"<?xml?><query type='generate'><word>" + word + "</word><word>" + example + "</word></query>", rLoc, ())
if not x:
return []
t = x.getAlternatives()
if not t:
t = []
return list(t)
# get suggestions
def suggest(rLoc, word):
global suggestions
if not word:
return word
if word not in suggestions:
x = spellchecker.spell("_" + word, rLoc, ())
if not x:
return word
t = x.getAlternatives()
suggestions[word] = "|".join(t)
return suggestions[word]
# get the nth word of the input string or None
def word(s, n):
a = re.match("(?u)( [-.\\w%%]+){" + str(n-1) + "}( [-.\\w%%]+)", s)
if not a:
return ''
return a.group(2)[1:]
# get the (-)nth word of the input string or None
def wordmin(s, n):
a = re.search("(?u)([-.\\w%%]+ )([-.\\w%%]+ ){" + str(n-1) + "}$", s)
if not a:
return ''
return a.group(1)[:-1]
def calc(funcname, par):
global calcfunc
global SMGR
if calcfunc == None:
calcfunc = SMGR.createInstance( "com.sun.star.sheet.FunctionAccess")
if calcfunc == None:
return None
return calcfunc.callFunction(funcname, par)
def proofread( nDocId, TEXT, LOCALE, nStartOfSentencePos, nSuggestedSentenceEndPos, rProperties ):
global ignore
aErrs = []
s = TEXT[nStartOfSentencePos:nSuggestedSentenceEndPos]
for i in get_rule(LOCALE).dic:
# 0: regex, 1: replacement, 2: message, 3: condition, 4: ngroup, (5: oldline), 6: case sensitive ?
if i[0] and not str(i[0]) in ignore:
for m in i[0].finditer(s):
try:
if not i[3] or eval(i[3]):
aErr = uno.createUnoStruct( "com.sun.star.linguistic2.SingleProofreadingError" )
aErr.nErrorStart = nStartOfSentencePos + m.start(i[4]) # nStartOfSentencePos
aErr.nErrorLength = m.end(i[4]) - m.start(i[4])
aErr.nErrorType = PROOFREADING
aErr.aRuleIdentifier = str(i[0])
iscap = (i[-1] and m.group(i[4])[0:1].isupper())
if i[1][0:1] == "=":
aErr.aSuggestions = tuple(cap(eval(i[1][1:]).replace('|', "\n").split("\n"), iscap, LOCALE))
elif i[1] == "_":
aErr.aSuggestions = ()
else:
aErr.aSuggestions = tuple(cap(m.expand(i[1]).replace('|', "\n").split("\n"), iscap, LOCALE))
comment = i[2]
if comment[0:1] == "=":
comment = eval(comment[1:])
else:
comment = m.expand(comment)
aErr.aShortComment = comment.replace('|', '\n').replace('\\n', '\n').split("\n")[0].strip()
aErr.aFullComment = comment.replace('|', '\n').replace('\\n', '\n').split("\n")[-1].strip()
if "://" in aErr.aFullComment:
p = PropertyValue()
p.Name = "FullCommentURL"
p.Value = aErr.aFullComment
aErr.aFullComment = aErr.aShortComment
aErr.aProperties = (p,)
else:
aErr.aProperties = ()
aErrs = aErrs + [aErr]
except Exception as e:
if len(i) == 7:
raise Exception(str(e), i[5])
raise
return tuple(aErrs)
def cap(a, iscap, rLoc):
if iscap:
for i in range(0, len(a)):
if a[i][0:1] == "i":
if rLoc.Language == "tr" or rLoc.Language == "az":
a[i] = u"\u0130" + a[i][1:]
elif a[i][1:2] == "j" and rLoc.Language == "nl":
a[i] = "IJ" + a[i][2:]
else:
a[i] = "I" + a[i][1:]
else:
a[i] = a[i].capitalize()
return a
def compile_rules(dic):
# compile regular expressions
for i in dic:
try:
if re.compile("[(][?]iu[)]").match(i[0]):
i += [True]
i[0] = re.sub("[(][?]iu[)]", "(?u)", i[0])
else:
i += [False]
i[0] = re.compile(i[0])
except:
if 'PYUNO_LOGLEVEL' in os.environ:
print("Lightproof: bad regular expression: " + str(traceback.format_exc()))
i[0] = None
def get_rule(loc):
try:
return langrule[pkg]
except:
langrule[pkg] = __import__("lightproof_" + pkg)
compile_rules(langrule[pkg].dic)
return langrule[pkg]
def get_path():
return os.path.join(os.path.dirname(sys.modules[__name__].__file__), __name__ + ".py")
# [code]

View File

@@ -0,0 +1,4 @@
lopts = {}
lopts_default = {}
lopts['ru_RU'] = ['hyphen', 'comma', 'multiword', 'together', 'common', 'space', 'abbreviation', 'dup', 'numsep', 'typographica', 'quotation']
lopts_default['ru_RU'] = ['hyphen', 'comma', 'multiword', 'together', 'common', 'space', 'abbreviation', 'dup', 'typographica']

View File

@@ -0,0 +1,148 @@
# -*- encoding: UTF-8 -*-
dic = [
['(?iu)(?<![-\\w\\u2013.,\\u00AD])\\b[Ff][Oo][Oo]\\b(?![-\\w\\u2013\\u00AD])', 'bar', 'test', False, 0],
['(?iu)(?<![-\\w\\u2013.,\\u00AD]) ([.?!,:;)”]($| ))(?![-\\w\\u2013\\u00AD])', '\\1', 'Лишний пробел перед знаком пунктуации.', 'option(LOCALE,"space")', 0],
['(?iu)(?<![-\\w\\u2013.,\\u00AD])([(“]) (?![-\\w\\u2013\\u00AD])', '\\1', 'Лишний пробел после знака пунктуации.', 'option(LOCALE,"space")', 0],
['(?iu)(?<![-\\w\\u2013.,\\u00AD])(?P<Abc_1>[a-zA-ZA-Zа-яА-ЯА-Я][a-zA-ZA-Zа-яА-ЯА-Я]+)(?P<punct_1>[?!,:;%‰‱˚“”‘„])(?P<Abc_2>[a-zA-ZA-Zа-яА-ЯА-Я][a-zA-ZA-Zа-яА-ЯА-Я]+)(?![-\\w\\u2013\\u00AD])', '\\g<Abc_1>\\g<punct_1> \\g<Abc_2>', 'Пропущен пробел?', 'option(LOCALE,"space")', 0],
['(?iu)(?<![-\\w\\u2013.,\\u00AD])(?P<Abc_1>[a-zA-ZA-Zа-яА-ЯА-Я][a-zA-ZA-Zа-яА-ЯА-Я]+)[.](?P<ABC_1>[A-ZА-Я][a-zA-Zа-яА-Я]+)(?![-\\w\\u2013\\u00AD])', '\\g<Abc_1>. \\g<ABC_1>', 'Пропущен пробел?', 'option(LOCALE,"space")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])[.]{3}(?![-\\w\\u2013\\u00AD])', '', 'Символ многоточия.', 'option(LOCALE,"typographica")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])(\\d+)x(\\d+)(?![-\\w\\u2013\\u00AD])', '\\1×\\2', 'Знак умножения.', 'option(LOCALE,"typographica")', 0],
['(?u)((?<=[!?.] )|^)[-—] (?![-\\w\\u2013\\u00AD])', ' ', 'Заменить на тире (n-dash)?', 'option(LOCALE,"typographica")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD]) [-—]([ ,;])(?![-\\w\\u2013\\u00AD])', ' \\1', 'Заменить на тире (n-dash)?', 'option(LOCALE,"typographica")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])[,]{2}(?![-\\w\\u2013\\u00AD])', ',', 'Две запятые подряд.', 'option(LOCALE,"comma")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])[ ](?P<abbr_1>руб|коп|грн|тыс|ул|кв|пос|ст|пр|просп|ед|экз|тел|исп)[ ](?![-\\w\\u2013\\u00AD])', ' \\g<abbr_1>. ', 'Точка после сокращений.', 'option(LOCALE,"abbreviation")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])(^|\\b|(?P<punct_1>[?!,:;%‰‱˚“”‘„])|[.]) {2,3}(\\b|$)(?![-\\w\\u2013\\u00AD])', '\\1 ', 'Лишний пробел.', 'option(LOCALE,"space")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\"(\\w[^\\"“”]*[\\w.?!,])\\"(?![-\\w\\u2013\\u00AD])', '«\\', 'Кавычки.', 'option(LOCALE,"quotation")', 0],
["(?u)(?<![-\\w\\u2013.,\\u00AD])\\B'(\\w[^']*[\\w.?!,])'\\B(?![-\\w\\u2013\\u00AD])", '\\1', 'Кавычки.', 'option(LOCALE,"quotation")', 0],
["(?u)(?<![-\\w\\u2013.,\\u00AD])(?P<Abc_1>[a-zA-Zа-яА-Я][a-zA-Zа-яА-Я]+)'(?P<w_1>\\w*)(?![-\\w\\u2013\\u00AD])", '\\g<Abc_1>\\g<w_1>', 'Апостроф.', 'option(LOCALE,"quotation")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])(?P<abc_1>[a-zа-я][a-zа-я]+)[ ]а[ ](?![-\\w\\u2013\\u00AD])', '\\g<abc_1>, а ', 'Пропущена запятая перед а.', 'option(LOCALE,"comma")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])(?P<abc_1>[a-zа-я][a-zа-я]+)[ ]но[ ](?![-\\w\\u2013\\u00AD])', '\\g<abc_1>, но ', 'Пропущена запятая перед но.', 'option(LOCALE,"comma")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])(?P<abc_1>[a-zа-я][a-zа-я]+), (?P<novvod_1>авось|буквально|будто|вдобавок|вдруг|ведь|вот|даже|исключительно|именно|небось|приблизительно|примерно|притом|почти|поэтому|просто|решительно|словно|якобы|в довершение|в конечном счете|в конечном счёте|вряд ли|все-таки|как будто|как бы|как раз|к тому же|между тем|по предложению|по постановлению|по решению),(?![-\\w\\u2013\\u00AD])', '\\g<abc_1> \\g<novvod_1>', 'Слова, не являющиеся вводными.', 'option(LOCALE,"comma")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])(?P<abc_1>[a-zа-я][a-zа-я]+) (?P<vvod_1>итак|следовательно|во-первых|во-вторых|в-третьих|в-четвертых|в-четвёртых|в-пятых|пожалуйста|как нарочно|как исключение|как правило)(?![-\\w\\u2013\\u00AD])', '\\g<abc_1>, \\g<vvod_1>,', 'Слова, являющиеся вводными, выделяются запятыми.', 'option(LOCALE,"comma")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\ожить\\b(?![-\\w\\u2013\\u00AD])', 'класть', 'Общие ошибки', 'option(LOCALE,"common")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bляжь\\b(?![-\\w\\u2013\\u00AD])', 'ляг', 'Общие ошибки', 'option(LOCALE,"common")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bехай\\b(?![-\\w\\u2013\\u00AD])', 'поезжай', 'Общие ошибки', 'option(LOCALE,"common")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\хн(?P<abc_1>[a-zа-я][a-zа-я]+)\\b(?![-\\w\\u2013\\u00AD])', 'их', 'Притяжательное местоимение не склоняется', 'option(LOCALE,"common")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])жы(?![-\\w\\u2013\\u00AD])', 'жи', 'Через "и"', 'option(LOCALE,"common")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])шы(?![-\\w\\u2013\\u00AD])', 'ши', 'Через "и"', 'option(LOCALE,"common")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\орд ост\\b(?![-\\w\\u2013\\u00AD])', 'норд-ост', 'Дефис? \\n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81', 'option(LOCALE,"hyphen")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\орд вест\\b(?![-\\w\\u2013\\u00AD])', 'норд-вест', 'Дефис? \\n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81', 'option(LOCALE,"hyphen")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bзюйд ост\\b(?![-\\w\\u2013\\u00AD])', 'зюйд-ост', 'Дефис? \\n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81', 'option(LOCALE,"hyphen")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bзюйд вест\\b(?![-\\w\\u2013\\u00AD])', 'зюйд-вест', 'Дефис? \\n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81', 'option(LOCALE,"hyphen")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bсеверо западн(?P<abc_1>[a-zа-я][a-zа-я]+)\\b(?![-\\w\\u2013\\u00AD])', 'северо-западн\\g<abc_1>', 'Дефис? \\n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81', 'option(LOCALE,"hyphen")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\го западн(?P<abc_1>[a-zа-я][a-zа-я]+)\\b(?![-\\w\\u2013\\u00AD])', 'юго-западн\\g<abc_1>', 'Дефис? \\n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81', 'option(LOCALE,"hyphen")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bсеверо восточн(?P<abc_1>[a-zа-я][a-zа-я]+)\\b(?![-\\w\\u2013\\u00AD])', 'северо-восточн\\g<abc_1>', 'Дефис? \\n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81', 'option(LOCALE,"hyphen")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\го восточн(?P<abc_1>[a-zа-я][a-zа-я]+)\\b(?![-\\w\\u2013\\u00AD])', 'юго-восточн\\g<abc_1>', 'Дефис? \\n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81', 'option(LOCALE,"hyphen")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\b(?P<adv1_1>кто|что|где|зачем|кое) нибудь\\b(?![-\\w\\u2013\\u00AD])', '\\g<adv1_1>-нибудь', 'Дефис? \\n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81', 'option(LOCALE,"hyphen")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\b(?P<adv1_1>кто|что|где|зачем|кое) либо\\b(?![-\\w\\u2013\\u00AD])', '\\g<adv1_1>-либо', 'Дефис? \\n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81', 'option(LOCALE,"hyphen")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\b(?P<adv1_1>кто|что|где|зачем|кое) то\\b(?![-\\w\\u2013\\u00AD])', '\\g<adv1_1>-то', 'Дефис? \\n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81', 'option(LOCALE,"hyphen")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\очь в точь\\b(?![-\\w\\u2013\\u00AD])', 'точь-в-точь', 'Дефис? \\n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81', 'option(LOCALE,"hyphen")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bиз за\\b(?![-\\w\\u2013\\u00AD])', 'из-за', 'Дефис? \\n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81', 'option(LOCALE,"hyphen")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\сё таки\\b(?![-\\w\\u2013\\u00AD])', 'всё-таки', 'Дефис? \\n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81', 'option(LOCALE,"hyphen")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\ое кто\\b(?![-\\w\\u2013\\u00AD])', 'кое-кто', 'Дефис? \\n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81', 'option(LOCALE,"hyphen")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\ое что\\b(?![-\\w\\u2013\\u00AD])', 'кое-что', 'Дефис? \\n http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D1%84%D0%B8%D1%81', 'option(LOCALE,"hyphen")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\о что бы то нe стало\\b(?![-\\w\\u2013\\u00AD])', 'во что бы то ни стало', 'Оборот', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\о чтобы то нe стало\\b(?![-\\w\\u2013\\u00AD])', 'во что бы то ни стало', 'Оборот', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\о чтобы то ни стало\\b(?![-\\w\\u2013\\u00AD])', 'во что бы то ни стало', 'Оборот', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\акже как и\\b(?![-\\w\\u2013\\u00AD])', 'так же как и', 'Сложный союз.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\о избежании\\b(?![-\\w\\u2013\\u00AD])', 'во избежание', 'Сложный предлог.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bравноправны друг другу\\b(?![-\\w\\u2013\\u00AD])', 'равноправны друг c другом', 'Равноправны друг c другом.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bни кто иной как\\b(?![-\\w\\u2013\\u00AD])', 'не кто иной, как', 'Оборот.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bни что иное как\\b(?![-\\w\\u2013\\u00AD])', 'не что иное, как', 'Оборот.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\е кто иной как\\b(?![-\\w\\u2013\\u00AD])', 'не кто иной, как', 'Оборот.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\е что иное как\\b(?![-\\w\\u2013\\u00AD])', 'не что иное, как', 'Оборот.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bникто иной, не\\b(?![-\\w\\u2013\\u00AD])', 'никто иной не', 'Оборот.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bничто иное, не\\b(?![-\\w\\u2013\\u00AD])', 'ничто иное не', 'Оборот.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\екто иной, не\\b(?![-\\w\\u2013\\u00AD])', 'никто иной не', 'Оборот.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\ечто иное, не\\b(?![-\\w\\u2013\\u00AD])', 'ничто иное не', 'Оборот.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\екто иной не\\b(?![-\\w\\u2013\\u00AD])', 'никто иной не', 'Оборот.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\ечто иное не\\b(?![-\\w\\u2013\\u00AD])', 'ничто иное не', 'Оборот.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\е кто иной, не\\b(?![-\\w\\u2013\\u00AD])', 'никто иной не', 'Оборот.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\е что иное, не\\b(?![-\\w\\u2013\\u00AD])', 'ничто иное не', 'Оборот.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\е кто иной не\\b(?![-\\w\\u2013\\u00AD])', 'никто иной не', 'Оборот.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\е что иное не\\b(?![-\\w\\u2013\\u00AD])', 'ничто иное не', 'Оборот.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bникто иной, не\\b(?![-\\w\\u2013\\u00AD])', 'никто иной не', 'Оборот.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bничто иное, не\\b(?![-\\w\\u2013\\u00AD])', 'ничто иное не', 'Оборот.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bни кто иной, не\\b(?![-\\w\\u2013\\u00AD])', 'никто иной не', 'Оборот.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bни что иное, не\\b(?![-\\w\\u2013\\u00AD])', 'ничто иное не', 'Оборот.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])(в) (течение) (реки|потока|воды|ручья)(?![-\\w\\u2013\\u00AD])', '\\1 течении \\3', 'Грамматическая ошибка', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])(в) (течении) (часа|минуты|промежутка|секунды|дня|времени|недели|месяца|года|столетия|тысячелетия)(?![-\\w\\u2013\\u00AD])', '\\1 течение \\3', 'Грамматическая ошибка', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])(в) (продолжении) (часа|минуты|промежутка|секунды|дня|времени|недели|месяца|года|столетия|тысячелетия|разговора|беседы)(?![-\\w\\u2013\\u00AD])', '\\1 продолжение \\3', 'Грамматическая ошибка', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\акбудто(?![-\\w\\u2013\\u00AD])', 'как будто', 'Составная частица', 'option(LOCALE,"together")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bпо мимо\\b(?![-\\w\\u2013\\u00AD])', 'помимо', 'Пишется слитно', 'option(LOCALE,"together")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\а кануне\\b(?![-\\w\\u2013\\u00AD])', 'накануне', 'Слитно', 'option(LOCALE,"together")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\а подобие\\b(?![-\\w\\u2013\\u00AD])', 'наподобие', 'Слитно', 'option(LOCALE,"together")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\а против\\b(?![-\\w\\u2013\\u00AD])', 'напротив', 'Слитно', 'option(LOCALE,"together")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bв низу\\b(?![-\\w\\u2013\\u00AD])', 'внизу', 'Слитно', 'option(LOCALE,"together")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bс низу\\b(?![-\\w\\u2013\\u00AD])', 'снизу', 'Слитно', 'option(LOCALE,"together")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\а верху\\b(?![-\\w\\u2013\\u00AD])', 'наверху', 'Слитно', 'option(LOCALE,"together")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bв верху\\b(?![-\\w\\u2013\\u00AD])', 'вверху', 'Слитно', 'option(LOCALE,"together")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bс верху\\b(?![-\\w\\u2013\\u00AD])', 'сверху', 'Слитно', 'option(LOCALE,"together")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bс верх\\b(?![-\\w\\u2013\\u00AD])', 'сверх', 'Слитно', 'option(LOCALE,"together")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bс выше\\b(?![-\\w\\u2013\\u00AD])', 'свыше', 'Слитно', 'option(LOCALE,"together")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bсо гласно\\b(?![-\\w\\u2013\\u00AD])', 'согласно', 'Слитно', 'option(LOCALE,"together")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bв глубь\\b(?![-\\w\\u2013\\u00AD])', 'вглубь', 'Слитно', 'option(LOCALE,"together")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bв доль\\b(?![-\\w\\u2013\\u00AD])', 'вдоль', 'Слитно', 'option(LOCALE,"together")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bв замен\\b(?![-\\w\\u2013\\u00AD])', 'взамен', 'Слитно', 'option(LOCALE,"together")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bв место\\b(?![-\\w\\u2013\\u00AD])', 'вместо', 'Слитно', 'option(LOCALE,"together")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\а место\\b(?![-\\w\\u2013\\u00AD])', 'заместо', 'Слитно', 'option(LOCALE,"together")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bни же\\b(?![-\\w\\u2013\\u00AD])', 'ниже', 'Слитно', 'option(LOCALE,"together")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bпо середине\\b(?![-\\w\\u2013\\u00AD])', 'посередине', 'Слитно', 'option(LOCALE,"together")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\b(?P<d2_1>\\d\\d)(?P<d_1>\\d\\d\\d)\\b(?![-\\w\\u2013\\u00AD])', '\\g<d2_1>\xa0\\g<d_1>', 'Добавить разделитель разрядов (ISO)?', 'option(LOCALE,"numsep")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\b(?P<D_1>\\d|\\d\\d|\\d\\d\\d)(?P<d_1>\\d\\d\\d)(?P<d_2>\\d\\d\\d)\\b(?![-\\w\\u2013\\u00AD])', '\\g<D_1>\xa0\\g<d_1>\xa0\\g<d_2>', 'Добавить разделитель разрядов (ISO)?', 'option(LOCALE,"numsep")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\b(?P<D_1>\\d|\\d\\d|\\d\\d\\d)(?P<d_1>\\d\\d\\d)(?P<d_2>\\d\\d\\d)(?P<d_3>\\d\\d\\d)\\b(?![-\\w\\u2013\\u00AD])', '\\g<D_1>\xa0\\g<d_1>\xa0\\g<d_2>\xa0\\g<d_3>', 'Добавить разделитель разрядов (ISO)?', 'option(LOCALE,"numsep")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bблизкий свет\\b(?![-\\w\\u2013\\u00AD])', 'ближний свет', 'Опечатка?', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bближний друг\\b(?![-\\w\\u2013\\u00AD])', 'близкий друг', 'Опечатка?', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\екотливая дилемма\\b(?![-\\w\\u2013\\u00AD])', 'щекотливый вопрос', 'Фразеологизм.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bпоёт в одну дуду\\b(?![-\\w\\u2013\\u00AD])', 'поёт в один голос', 'Фразеологизм.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bпоет в одну дуду\\b(?![-\\w\\u2013\\u00AD])', 'поёт в один голос', 'Фразеологизм.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\е упасть лицом в грязь\\b(?![-\\w\\u2013\\u00AD])', 'не ударить лицом в грязь', 'Фразеологизм.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bотдал руку и сердце\\b(?![-\\w\\u2013\\u00AD])', 'предложил руку и сердце', 'Фразеологизм.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bизбиение грешников\\b(?![-\\w\\u2013\\u00AD])', 'избиение младенцев', 'Фразеологизм.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\акадычная подруга\\b(?![-\\w\\u2013\\u00AD])', 'лучшая подруга', 'Фразеологизм.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bпромокли до костей\\b(?![-\\w\\u2013\\u00AD])', 'промокли до нитки', 'Фразеологизм.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bпромёрзли до нитки\\b(?![-\\w\\u2013\\u00AD])', 'промёрзли до костей', 'Фразеологизм.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bпромерзли до нитки\\b(?![-\\w\\u2013\\u00AD])', 'промёрзли до костей', 'Фразеологизм.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\амёрзли до нитки\\b(?![-\\w\\u2013\\u00AD])', 'замёрзли до костей', 'Фразеологизм.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\амерзли до нитки\\b(?![-\\w\\u2013\\u00AD])', 'замёрзли до костей', 'Фразеологизм.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bглас, вопиющий в пустыне\\b(?![-\\w\\u2013\\u00AD])', 'глас вопиющего в пустыне', 'Фразеологизм.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bни кто иной, как\\b(?![-\\w\\u2013\\u00AD])', 'не кто иной, как', 'Оборот.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bрешит эту затянувшуюся проблему\\b(?![-\\w\\u2013\\u00AD])', 'ускорит затянувшееся решение проблемы', 'Логическая ошибка.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bрешит затянувшуюся проблему\\b(?![-\\w\\u2013\\u00AD])', 'ускорит затянувшееся решение проблемы', 'Логическая ошибка.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bподорожали цены\\b(?![-\\w\\u2013\\u00AD])', 'цены выросли', 'Логическая ошибка.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bподнял тост\\b(?![-\\w\\u2013\\u00AD])', 'произнёс тост', 'Логическая ошибка.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bулучшение отмеченных недостатков\\b(?![-\\w\\u2013\\u00AD])', 'устранение отмеченных недостатков', 'Логическая ошибка.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bв этой связи\\b(?![-\\w\\u2013\\u00AD])', 'в связи с этим', 'Логическая ошибка.', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bодел рубашку\\b(?![-\\w\\u2013\\u00AD])', 'надел рубашку', 'Логическая ошибка', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bодеть рубашку\\b(?![-\\w\\u2013\\u00AD])', 'надеть рубашку', 'Логическая ошибка', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bодела платье\\b(?![-\\w\\u2013\\u00AD])', 'надела платье', 'Логическая ошибка', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bодеть платье\\b(?![-\\w\\u2013\\u00AD])', 'надеть платье', 'Логическая ошибка', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bодела юбку\\b(?![-\\w\\u2013\\u00AD])', 'надела юбку', 'Логическая ошибка', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bодеть юбку\\b(?![-\\w\\u2013\\u00AD])', 'надеть юбку', 'Логическая ошибка', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bодел куртку\\b(?![-\\w\\u2013\\u00AD])', 'надел куртку', 'Логическая ошибка', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bодела куртку\\b(?![-\\w\\u2013\\u00AD])', 'надела куртку', 'Логическая ошибка', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bодеть куртку\\b(?![-\\w\\u2013\\u00AD])', 'надеть куртку', 'Логическая ошибка', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bодел пальто\\b(?![-\\w\\u2013\\u00AD])', 'надел пальто', 'Логическая ошибка', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bодела пальто\\b(?![-\\w\\u2013\\u00AD])', 'надела пальто', 'Логическая ошибка', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bодеть пальто\\b(?![-\\w\\u2013\\u00AD])', 'надеть пальто', 'Логическая ошибка', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bхрабрая идея\\b(?![-\\w\\u2013\\u00AD])', 'смелая идея', 'Логическая ошибка', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bхрабрая мысль\\b(?![-\\w\\u2013\\u00AD])', 'смелая мысль', 'Логическая ошибка', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])\\bхрабрая решение\\b(?![-\\w\\u2013\\u00AD])', 'смелая решение', 'Логическая ошибка', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD]), что угодно(?![-\\w\\u2013\\u00AD])', ' что угодно', 'Запятая не нужна', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD]), как попало(?![-\\w\\u2013\\u00AD])', ' как попало', 'Запятая не нужна', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])(не|совсем|совершенно|почти|именно), как(?![-\\w\\u2013\\u00AD])', '\\1 как', 'Запятая не нужна', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])и то, и се(?![-\\w\\u2013\\u00AD])', 'и то и се', 'Запятая не нужна', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])и то, и сё(?![-\\w\\u2013\\u00AD])', 'и то и сё', 'Запятая не нужна', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])ни то, ни се(?![-\\w\\u2013\\u00AD])', 'ни то ни се', 'Запятая не нужна', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])ни то, ни сё(?![-\\w\\u2013\\u00AD])', 'ни то ни сё', 'Запятая не нужна', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])ни свет, ни заря(?![-\\w\\u2013\\u00AD])', 'ни свет ни заря', 'Запятая не нужна', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])и так, и сяк(?![-\\w\\u2013\\u00AD])', 'и так и сяк', 'Запятая не нужна', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])и туда, и сюда(?![-\\w\\u2013\\u00AD])', 'и туда и сюда', 'Запятая не нужна', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])ни рыба, ни мясо(?![-\\w\\u2013\\u00AD])', 'ни рыба ни мясо', 'Запятая не нужна', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])ни жив, ни мертв(?![-\\w\\u2013\\u00AD])', 'ни жив ни мертв', 'Запятая не нужна', 'option(LOCALE,"multiword")', 0],
['(?u)(?<![-\\w\\u2013.,\\u00AD])ни жив, ни мёртв(?![-\\w\\u2013\\u00AD])', 'ни жив ни мёртв', 'Запятая не нужна', 'option(LOCALE,"multiword")', 0],
['(?iu)(?<![-\\w\\u2013.,\\u00AD])(?P<W_1>[-\\w]{3,}) \\1(?![-\\w\\u2013\\u00AD])', '\\g<W_1>', 'Повтор слова?', 'option(LOCALE,"dup")', 0],
['(?iu)(?<![-\\w\\u2013.,\\u00AD])[Кк]В[Тт]/[Чч](?![-\\w\\u2013\\u00AD])', 'кВт⋅ч', 'Опечатка?', 'option(LOCALE,"common")', 0],
['(?iu)(?<![-\\w\\u2013.,\\u00AD])[Мм]А/[Чч](?![-\\w\\u2013\\u00AD])', 'мА⋅ч', 'Опечатка?', 'option(LOCALE,"common")', 0],
['(?iu)(?<![-\\w\\u2013.,\\u00AD])А/[Чч](?![-\\w\\u2013\\u00AD])', 'А⋅ч', 'Опечатка?', 'option(LOCALE,"common")', 0]
]