Во-первых: я очень плохо читаю регулярные выражения и работаю со знаками Юникода.
В правительстве Германии IT-системы должны поддерживать не все символы, а подмножество Latin_script_in_Unicode .
В официальной документации есть следующее регулярное выражение для XML-схема:
(([	-

 -~¡-¬®-ćĊ-ěĞ-ģĦ-ıĴ-śŞ-ūŮ-žƏƠ-ơƯ-ưƷǍ-ǔǞ-ǟǤ-ǰǴ-ǵǺ-ǿȘ-țȞ-ȟȪ-ȫȮ-ȳəʒḂ-ḃḊ-ḋḐ-ḑḞ-ḡḤ-ḧḰ-ḱṀ-ṁṄ-ṅṖ-ṗṠ-ṣṪ-ṫẀ-ẅẌ-ẓẞẠ-ầẪ-ẬẮ-ềỄ-ồỖ-ờỤ-ỹ€])|(M̂|N̂|m̂|n̂|D̂|d̂|J̌|L̂|l̂))*
Я сейчас пытаюсь перенести это регулярное выражение на Java и мне было интересно, как это сделать.Для моих первых шагов я написал эти два метода тестирования, которые являются очевидной допустимой латинской строкой или очевидной нет:
@Test
@DisplayName("OK: Just normal characters and numbers")
void testJustNormalCharacters() {
String sut = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
assertTrue(RegExPruefung.matches(sut, RegEx.T_VALIDSTRINGLATIN));
}
@Test
@DisplayName("NOK: Chinese sign")
void testChineseSign() {
String sut = "abc⺠";
assertFalse(RegExPruefung.matches(sut, RegEx.T_VALIDSTRINGLATIN));
}
Чтобы уточнить: я сохранил regEx в перечислении.Следующий метод вызывается в тестах.Как видите, он принимает только значение enum и помещает его в метод официальных совпадений.Для других регулярных выражений это прекрасно работает.
public static boolean matches(String stringToCheck, RegEx regExToMatch) {
return stringToCheck.matches(regExToMatch.getRegEx());
}
То, что я пробовал до сих пор:
1) Моя первая попытка состояла в том, чтобы экранировать -
с помощью \-
, чтобы использовать xml-schema выражает его в строке, но это все еще дает мне ложное значение в тесте только с символами и числами.
"^(([	\\-

 \\-~¡\\-¬®\\-ćĊ\\-ěĞ\\-ģĦ\\-ıĴ\\-śŞ\\-ūŮ\\-žƏƠ\\-ơƯ\\-ưƷǍ\\-ǔǞ\\-ǟǤ\\-ǰǴ\\-ǵǺ\\-ǿȘ\\-țȞ\\-ȟȪ\\-ȫȮ\\-ȳəʒḂ\\-ḃḊ\\-ḋḐ\\-ḑḞ\\-ḡḤ\\-ḧḰ\\-ḱṀ\\-ṁṄ\\-ṅṖ\\-ṗṠ\\-ṣṪ\\-ṫẀ\\-ẅẌ\\-ẓẞẠ\\-ầẪ\\-ẬẮ\\-ềỄ\\-ồỖ\\-ờỤ\\-ỹ€])|(M̂|N̂|m̂|n̂|D̂|d̂|J̌|L̂|l̂))*$"
2) Во-вторых, я попытался изменить регулярное выражение на предопределенный \p{isLatin}
, в результатев ^\\p{isLatin}*$
, но все же тест говорит, что первая строка не является допустимой латинской.
Как мне решить эту проблему?
edit: я не думаю, что это дубликат "SO Java regex для поддержки Unicode" , потому что я думаю, что моя главная проблема - понять, как я передаю выражение из xml-схемыв Яву.Тем не менее, поток помогает напомнить мне, что «начальный элемент» Юникода (\u
) должен быть экранирован двойной обратной косой чертой.