Мне нравится твоя "единственная идея" просто сделать статическую карту ширины символов! Это на самом деле хорошо работает для моих целей. Иногда по соображениям производительности или из-за того, что у вас нет простого доступа к DOM, вам может понадобиться быстрый взломанный автономный калькулятор, откалиброванный для одного шрифта. Итак, вот один, откалиброванный для Helvetica; передать строку и (необязательно) размер шрифта:
function measureText(str, fontSize = 10) {
const widths = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.2796875,0.2765625,0.3546875,0.5546875,0.5546875,0.8890625,0.665625,0.190625,0.3328125,0.3328125,0.3890625,0.5828125,0.2765625,0.3328125,0.2765625,0.3015625,0.5546875,0.5546875,0.5546875,0.5546875,0.5546875,0.5546875,0.5546875,0.5546875,0.5546875,0.5546875,0.2765625,0.2765625,0.584375,0.5828125,0.584375,0.5546875,1.0140625,0.665625,0.665625,0.721875,0.721875,0.665625,0.609375,0.7765625,0.721875,0.2765625,0.5,0.665625,0.5546875,0.8328125,0.721875,0.7765625,0.665625,0.7765625,0.721875,0.665625,0.609375,0.721875,0.665625,0.94375,0.665625,0.665625,0.609375,0.2765625,0.3546875,0.2765625,0.4765625,0.5546875,0.3328125,0.5546875,0.5546875,0.5,0.5546875,0.5546875,0.2765625,0.5546875,0.5546875,0.221875,0.240625,0.5,0.221875,0.8328125,0.5546875,0.5546875,0.5546875,0.5546875,0.3328125,0.5,0.2765625,0.5546875,0.5,0.721875,0.5,0.5,0.5,0.3546875,0.259375,0.353125,0.5890625]
const avg = 0.5279276315789471
return str
.split('')
.map(c => c.charCodeAt(0) < widths.length ? widths[c.charCodeAt(0)] : avg)
.reduce((cur, acc) => acc + cur) * fontSize
}
Этот гигантский уродливый массив представляет собой ширину символов ASCII, проиндексированную кодом символов. Так что это просто поддерживает ASCII (в противном случае предполагается средняя ширина символов). К счастью, ширина в основном линейно масштабируется в зависимости от размера шрифта, поэтому она отлично работает при любом размере шрифта. Ему явно не хватает понимания кернинга, лигатур или чего-то еще.
Чтобы «откалибровать», я просто рендерил каждый символ до charCode 126 (могущественная тильда) в SVG, получил ограничивающий прямоугольник и сохранил его в этом массиве; больше кода и объяснения и демо здесь .
Используйте path.getParentFile ()
несколько раз, чтобы получить все компоненты пути.
Не рекомендуется использовать path.replaceAll ("\\" , "/").split("/")[1139193 sizes.[1220 visible
А как насчет
String[] subDirs = path.split(File.separator.replaceAll("\\", "\\\\"));
Всякий раз, когда вам нужно буквализировать произвольную строку
, которая будет использоваться в качестве шаблона регулярного выражения, используйте Pattern.quote
:
Из API:
public static String quote (String s)
Возвращает буквальный шаблон
String
для указаннойString
. Этот метод создаетString
, который можно использовать для созданияPattern
, который будет соответствовать строкеs
, как если бы это был буквальный образец. Метасимволы или escape-последовательности во входной последовательности не будут иметь особого значения.Параметры:
s
- Строка, которую нужно преобразовать в литературу
Возвращает: Буквальная замена строки
Это означает, что вы можете сделать следующее:
String[] subDirs = path.split(Pattern.quote(File.separator));
Если вам нужно буквализировать произвольную замену String
, используйте Matcher.quoteReplacement
.
Из API:
общедоступная статическая String quoteReplacement (String s)
Возвращает буквальную замену
String
для указаннойString
. Этот метод создаетString
, который будет работать как буквальная заменаs
в методеappendReplacement
классаMatcher
.Созданная строкабудет соответствовать последовательности символов в
s
, рассматриваемой как буквальная последовательность. Косые черты ('\'
) и знаки доллара ('$'
) не будут иметь особого значения.Параметры:
s
- Строка, которую нужно преобразовать в литературу
Возвращает: Буквальная замена строки
Эта цитируемая замена Строка
также полезна в String.replaceFirst
и String.replaceAll
:
Обратите внимание, что обратная косая черта (
\
) и знаки доллара ($
) в строке замены могут вызвать результаты будут отличаться от результатов, если бы они рассматривались как буквальная замещающая строка. При необходимости используйтеMatcher.quoteReplacement
, чтобы подавить особое значение этих символов.
System.out.println(
"O.M.G.".replaceAll(".", "!")
); // prints "!!!!!!"
System.out.println(
"O.M.G.".replaceAll(Pattern.quote("."), "!")
); // prints "O!M!G!"
System.out.println(
"Microsoft software".replaceAll("so", "$0")
); // prints "Microsoft software"
System.out.println(
"Microsoft software".replaceAll("so", Matcher.quoteReplacement("$0"))
); // prints "Micro$0ft $0ftware"