<span id="text">Text</span>
<script>
var textWidth = document.getElementById("text").offsetWidth;
</script>
Это должно работать пока < span> тег не имеет никаких других стилей, относился к нему. offsetWidth будет включать ширину любых границ, горизонтального дополнения, вертикальной ширины полосы прокрутки, и т.д.
((?<=[a-z])[A-Z]|[A-Z](?=[a-z]))
или его Unicode -aware двоюродный брат
((?<=\p{Ll})\p{Lu}|\p{Lu}(?=\p{Ll}))
при замене глобально на
" $1"
дескрипторы
TodayILiveInTheUSAWithSimon USAToday IAmSOOOBored
уступающие
Today I Live In The USA With Simon USA Today I Am SOOO Bored
На втором этапе вам нужно будет обрезать строку.
любой символ верхнего регистра, за которым не следует символ верхнего регистра:
Replace(string, "([A-Z])(?![A-Z])", " $1")
Изменить:
Я только что заметил, что вы используете это для перечислений. Я действительно не поощряю использование строковых представлений перечислений, подобных этому, и существующие проблемы - хорошая причина для этого. Взгляните на это вместо этого: http://www.refactoring.com/catalog/replaceTypeCodeWithClass.html
Вы можете подумать об изменении перечислений; Руководства по кодированию MS предлагают использовать аббревиатуры Паскаля в регистре, как если бы они были словами; XmlDocument
, HtmlWriter
и т.д. Однако двухбуквенные акрионимы не подчиняются этому правилу; System.IO
.
Итак, вы должны использовать UsaToday
, и ваша проблема исчезнет.
У меня сработало выражение Томалака, но не встроенная функция Replace
. Regex.Replace ()
, однако, сработало.
For i As Integer = 0 To names.Length - 1
'Worked
names(i) = Regex.Replace(names(i), "((?<=[a-z])[A-Z]|[A-Z](?=[a-z]))", " $1").TrimStart()
' Didn't work
'names(i) = Replace(names(i), "([A-Z])(?=[a-z])|(?<=[a-z])([A-Z])", " $1").TrimStart()
Next
Кстати, я использую это, чтобы разделить слова в именах перечислений для отображения в пользовательском интерфейсе, и это прекрасно работает.