Как разделить независимый от платформы путь?

Мне нравится твоя "единственная идея" просто сделать статическую карту ширины символов! Это на самом деле хорошо работает для моих целей. Иногда по соображениям производительности или из-за того, что у вас нет простого доступа к 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, получил ограничивающий прямоугольник и сохранил его в этом массиве; больше кода и объяснения и демо здесь .

17
задан Janusz 8 July 2009 в 18:40
поделиться

3 ответа

Используйте path.getParentFile () несколько раз, чтобы получить все компоненты пути.

Не рекомендуется использовать path.replaceAll ("\\" , "/").split("/")[1139193 sizes.[1220 visible

14
ответ дан 30 November 2019 в 10:29
поделиться

А как насчет

String[] subDirs = path.split(File.separator.replaceAll("\\", "\\\\"));
-2
ответ дан 30 November 2019 в 10:29
поделиться

Литерализация строк шаблона

Всякий раз, когда вам нужно буквализировать произвольную строку , которая будет использоваться в качестве шаблона регулярного выражения, используйте 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"
38
ответ дан 30 November 2019 в 10:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: