Я не программист на Java, так что здесь просто базовое решение для регулярных выражений.
Если вы можете Нормализовать строку с ее декомпозицией формой
предположить, что это
String sSourceTargetDecom = Normalizer.normalize(sourcetarget, Normalizer.Form.NFD);
,
это должно превратить что-то вроде 0000C1 Á LATIN CAPITAL LETTER A WITH ACUTE
в два символа A
и 000301 ́ COMBINING ACUTE ACCENT
.
Вы можете получить большинство комбинирующих символов из блоков, используя
[\p{Block=Combining_Diacritical_Marks}\p{Block=Combining_Diacritical_Marks_Extended}\p{Block=Combining_Diacritical_Marks_For_Symbols}\p{Block=Combining_Diacritical_Marks_Supplement}\p{Block=Combining_Half_Marks}]
, который имеет шестнадцатеричный диапазон
[\x{300}-\x{36f}\x{1ab0}-\x{1aff}\x{1dc0}-\x{1dff}\x{20d0}-\x{20ff}\x{fe20}-\x{fe2f}]
Оказывается, что большинство комбинирующих меток относительнобазовая латиница, которая может быть разложена на
, находится в диапазоне [\x{300}-\x{36f}]
.
Вы можете разложить и исходную цель и строку поиска ввода.
Затем создать регулярное выражение из строки поиска ввода. Введите [\x{300}-\x{36f}]?
после каждой основной буквы латинского алфавита.
String regex = sSearch.replaceAll("([a-zA-Z])[\\x{300}-\\x{36f}]?", "\\1[\\x{300}-\\x{36f}]?");
(не уверен, что Java использует для обозначения кодовой точки в своем регулярном выражении, возможно, должно быть \u{DD}
Затем используйте регулярное выражение в строке sSourceTargetDecom , он будет соответствовать базовому латинскому языку как отдельному, и / или с дополнительным кодом объединения.