Задача
Категории Юникода часто слишком эксклюзивны или слишком инклюзивны, чтобы функционировать как категории для последовательной обработки текста, независимо от того, был ли он набран в блокноте (где сочетания клавиш отображаются в двойных / одинарных кавычках, апострофах и т. Д. ASCII) или в Microsoft Word (где сопоставление клавиш с не-ASCII символами в Unicode или кодовой странице Windows).
Желаемые категории для обработки текста
Я хотел бы создать текстовый процессор с использованием выражений Regex, которые могут последовательно и исчерпывающе идентифицировать такие элементы языка, как:
- апостроф (используется в сокращении, предположительно с буквой на каждой стороне)
- цитата (и более конкретно, является ли каждый начальный / конечный / одинарный / двойной)
- тире (em dash, en dash, дефис, минус и т. Д.) - категория Unicode: «пунктирная пунктуация»
- открывать / закрывать групповую пунктуацию (скобки, скобки, фигурные скобки и т. Д.) - категории Unicode: «OpenPunctuation» и «ClosePunctuation»
Однако такие категории не всегда соответствуют какой-либо конкретной категории Unicode или набору категорий.
Цитата / Апостроф Проблема
Категории, такие как «InitialQuotePunctuation» и «FinalQuotePunctuation», не различают одинарные и двойные кавычки, и фактически исключают общие двойные и одинарные кавычки ASCII, которые являются нейтральными / прямыми и поэтому не попадают ни в начальную, ни в конечную категорию , Вместо этого мы находим их в категории «Другая пунктуация» вместе со многими другими распространенными, но не связанными символами пунктуации. Реальная проблема заключается в том, что нам нужно отделить символы одинарных кавычек, чтобы получить полный набор возможных символов апострофа, поскольку кто-то может использовать такие символы в качестве апострофа.
Также проблема для кавычек / апострофов заключается в том, что надгробные и острые символы, которые можно легко использовать в качестве цитаты / апострофа при вводе в блокноте, находятся в категории «ModifierSymbol».
Заключительные мысли о желаемом решении
Я думаю, что тире и скобки довольно полные, хотя категория «DashPunctuation» исключает «swung dash» и «dashed overline», которые встречаются в категории «OtherPunctuation» с одиночными / двойными кавычками ASCII.
Я полагаю, что обнаружение языковых элементов, которые я идентифицировал выше, потребовало бы двухэтапного процесса, когда одному символу Unicode (например, апострофу ASCII) было разрешено сначала делиться на несколько категорий (например, апостроф И одиночная кавычка). ), так что вторичная контекстная проверка может решить, какая категория лучше всего подходит для ее очевидного использования.
Регулярное выражение для категории кавычек может включать в себя класс символов, подобный этому: [\ p {Pi} \ p {Pf} "'], с дополнительной проверкой, чтобы убедиться, что у него есть не буквенный символ на одной стороне или другой.
Вопрос
Как я могу систематически и надежно идентифицировать все возможные символы каждой из четырех перечисленных категорий? Как я объяснил, одних категорий Unicode недостаточно.