stringr
A comprehensive string manipulation library for Dart and Flutter. Inspired by VocaJS, stringr provides powerful string operations that work seamlessly with Latin, non-Latin, and Unicode strings.
Features
- Case Conversion - camelCase, snake_case, kebab-case, Title Case, PascalCase
- Unicode Support - Full support for non-Latin scripts, diacritics, and grapheme clusters
- Smart Word Detection - Uses regex patterns instead of simple whitespace splitting
- Null Safety - Fully null-safe and compatible with Dart 3.0+
- Zero Dependencies - Only depends on the
characterspackage for grapheme support
Installation
Add to your pubspec.yaml:
dependencies:
stringr: ^1.2.0
Quick Start
import 'package:stringr/stringr.dart';
void main() {
// Case conversions
print('hello world'.toCamelCase); // helloWorld
print('hello world'.toSnakeCase); // hello_world
print('hello world'.toKebabCase); // hello-world
print('hello world'.toPascalCase); // HelloWorld
// Smart word extraction
print('XMLHttpRequest'.camelCase()); // xmlHttpRequest
print('/path/to/file'.camelCase()); // pathToFile
print('2infinity&beyond'.words()); // [2, infinity, beyond]
}
Unicode & Non-Latin Support
stringr shines with complex Unicode strings:
// Non-Latin scripts
print('полет птицы'.kebabCase()); // полет-птицы
print('La variété française'.prune(12)); // La variété
// Diacritics and latinization
print('café'.latinize()); // cafe
print('anglikonų šiurkščios'.latinize()); // anglikonu siurkscios
// Grapheme-aware operations
print('café'.countGrapheme()); // 4 (not 5!)
print('👨👩👧👦'.reverse()); // 👨👩👧👦 (family emoji stays intact)
API Overview
Case Manipulation
| Method | Description | Example |
|---|---|---|
camelCase() |
Convert to camelCase | 'foo bar' → 'fooBar' |
snakeCase() |
Convert to snake_case | 'foo bar' → 'foo_bar' |
kebabCase() |
Convert to kebab-case | 'foo bar' → 'foo-bar' |
titleCase() |
Capitalize each word | 'foo bar' → 'Foo Bar' |
capitalize() |
Capitalize first char | 'foo' → 'Foo' |
swapCase() |
Toggle case | 'FoO' → 'fOo' |
String Chopping
| Method | Description | Example |
|---|---|---|
truncate(n) |
Truncate to n chars | 'hello world' → 'hello...' |
prune(n) |
Truncate without breaking words | 'hello world' → 'hello' |
first(n) |
Get first n chars | 'hello' → 'hel' |
last(n) |
Get last n chars | 'hello' → 'llo' |
slice(start, end) |
Extract substring | 'hello' → 'ell' |
Counting
| Method | Description | Example |
|---|---|---|
countGrapheme() |
Count visible characters | 'café' → 4 |
countOccurrences(s) |
Count substring occurrences | 'banana'.countOccurrences('a') → 3 |
countWords() |
Count words | 'hello world' → 2 |
countWhere(fn) |
Count matching chars | Custom predicate |
Manipulation
| Method | Description | Example |
|---|---|---|
reverse() |
Reverse (grapheme-aware) | 'hello' → 'olleh' |
slugify() |
URL-friendly slug | 'Hello World!' → 'hello-world' |
latinize() |
Remove diacritics | 'café' → 'cafe' |
insert(s, i) |
Insert at position | 'hllo'.insert('e', 1) → 'hello' |
Escaping
| Method | Description |
|---|---|
escapeHtml() |
Escape HTML entities |
unescapeHtml() |
Unescape HTML entities |
escapeRegExp() |
Escape regex special chars |
Why stringr?
Most string libraries fail with complex Unicode. stringr handles:
- Grapheme clusters:
'café'is 4 characters, not 5 - Surrogate pairs: Emoji and special symbols work correctly
- Non-Latin scripts: Cyrillic, Greek, accented Latin, and more
- Smart word detection:
'XMLHttpRequest'→['XML', 'Http', 'Request']
Contributing
Contributions are welcome! Please read our Contributing Guide for details.
License
MIT License - see LICENSE for details.