Strings, Text, Globalization and Regular Expressions

7.1 String Essentials

Dim s = "  Hello, VB.NET  "
s.Trim() : s.ToUpperInvariant() : s.Contains("VB") : s.IndexOf(","c)
s.Replace("Hello", "Hi") : s.Substring(2, 5) : s.Split(","c) : s.PadLeft(20, "."c)
String.Join(", ", {"a", "b"}) : String.Concat(parts) : String.IsNullOrWhiteSpace(s)
String.Equals(a, b, StringComparison.OrdinalIgnoreCase)
s.StartsWith("Hi", StringComparison.Ordinal)
Dim interp = $"Total: {total:C2} on {Date.Today:d}"
Dim aligned = $"|{name,-15}|{qty,5}|"
Dim multi = "First line
Second line"

7.2 StringBuilder and Performance

Strings are immutable, so concatenating in loops creates garbage. Use StringBuilder, String.Join, or String.Create (advanced).

Dim sb As New Text.StringBuilder(capacity:=256)
For Each line In lines
    sb.AppendLine(line)
Next
sb.AppendFormat("{0} items", lines.Count)
Dim text = sb.ToString()

7.3 Globalization and Localization

Use ordinal comparisons for identifiers, keys, and file paths, and culture-aware ones for user-visible text.

Localize UIs with .resx resource files (Resources.resx, Resources.fr.resx). WinForms forms have a Localizable = True property. Use My.Resources or ResourceManager.

Unicode: Char is UTF-16. Use StringInfo for grapheme clusters, Text.Rune for code points, and Encoding.UTF8 for I/O.

Imports System.Globalization
Dim inv = CultureInfo.InvariantCulture
Dim de = New CultureInfo("de-DE")
Console.WriteLine(1234.56D.ToString("N2", de))            ' 1.234,56
Console.WriteLine(Date.Today.ToString("D", New CultureInfo("fr-FR")))
CultureInfo.CurrentCulture = New CultureInfo("en-IN")
Dim cmp = String.Compare("straße", "STRASSE", CultureInfo.InvariantCulture, CompareOptions.IgnoreCase)

7.4 Regular Expressions

Imports System.Text.RegularExpressions
Private Shared ReadOnly EmailRx As New Regex("^[^@\s]+@[^@\s]+\.[^@\s]+$", RegexOptions.Compiled Or RegexOptions.IgnoreCase)
Dim valid = EmailRx.IsMatch("[email protected]")
Dim m = Regex.Match("INV-2025-0042", "INV-(?<year>\d{4})-(?<num>\d+)")
If m.Success Then Console.WriteLine($"{m.Groups("year").Value} / {m.Groups("num").Value}")
Dim digits = Regex.Replace("+91 98765-43210", "\D", "")
Dim safe = Regex.Match(input, pattern, RegexOptions.None, TimeSpan.FromMilliseconds(200))   ' timeout prevents ReDoS