comparison MetroWpf/MetroWpf.Framework/Extensions/StringExtensions.cs @ 15:060f02cd4591

Initial commit, pre airport work
author stevenh7776 stevenhollidge@hotmail.com
date Mon, 12 Mar 2012 23:05:21 +0800
parents
children
comparison
equal deleted inserted replaced
14:741981715d94 15:060f02cd4591
1 using System;
2 using System.Collections.Generic;
3 using System.IO;
4 using System.Text;
5 using System.Text.RegularExpressions;
6 using System.Xml;
7 using System.Xml.Linq;
8 using System.Xml.XPath;
9
10 namespace MetroWpf
11 {
12 /// <summary>
13 /// Extension methods for the string data type
14 /// </summary>
15 public static class StringExtensions
16 {
17 #region · Extensions ·
18
19 #region · Common string extensions ·
20
21 /// <summary>
22 /// Determines whether the specified string is null or empty.
23 /// </summary>
24 /// <param name="value">The string value to check.</param>
25 public static bool IsEmpty(this string value)
26 {
27 return ((value == null) || (value.Length == 0));
28 }
29
30 /// <summary>
31 /// Determines whether the specified string is not null or empty.
32 /// </summary>
33 /// <param name="value">The string value to check.</param>
34 public static bool IsNotEmpty(this string value)
35 {
36 return (value.IsEmpty() == false);
37 }
38
39 /// <summary>
40 /// Checks whether the string is empty and returns a default value in case.
41 /// </summary>
42 /// <param name="value">The string to check.</param>
43 /// <param name="defaultValue">The default value.</param>
44 /// <returns>Either the string or the default value.</returns>
45 public static string IfEmpty(this string value, string defaultValue)
46 {
47 return (value.IsNotEmpty() ? value : defaultValue);
48 }
49
50 /// <summary>
51 /// Formats the value with the parameters using string.Format.
52 /// </summary>
53 /// <param name="value">The input string.</param>
54 /// <param name="parameters">The parameters.</param>
55 /// <returns></returns>
56 public static string FormatWith(this string value, params object[] parameters)
57 {
58 return string.Format(value, parameters);
59 }
60
61 /// <summary>
62 /// Trims the text to a provided maximum length.
63 /// </summary>
64 /// <param name="value">The input string.</param>
65 /// <param name="maxLength">Maximum length.</param>
66 /// <returns></returns>
67 /// <remarks>Proposed by Rene Schulte</remarks>
68 public static string TrimToMaxLength(this string value, int maxLength)
69 {
70 return (value == null || value.Length <= maxLength ? value : value.Substring(0, maxLength));
71 }
72
73 /// <summary>
74 /// Trims the text to a provided maximum length and adds a suffix if required.
75 /// </summary>
76 /// <param name="value">The input string.</param>
77 /// <param name="maxLength">Maximum length.</param>
78 /// <param name="suffix">The suffix.</param>
79 /// <returns></returns>
80 /// <remarks>Proposed by Rene Schulte</remarks>
81 public static string TrimToMaxLength(this string value, int maxLength, string suffix)
82 {
83 return (value == null || value.Length <= maxLength ? value : string.Concat(value.Substring(0, maxLength), suffix));
84 }
85
86 /// <summary>
87 /// Determines whether the comparison value strig is contained within the input value string
88 /// </summary>
89 /// <param name="inputValue">The input value.</param>
90 /// <param name="comparisonValue">The comparison value.</param>
91 /// <param name="comparisonType">Type of the comparison to allow case sensitive or insensitive comparison.</param>
92 /// <returns>
93 /// <c>true</c> if input value contains the specified value, otherwise, <c>false</c>.
94 /// </returns>
95 public static bool Contains(this string inputValue, string comparisonValue, StringComparison comparisonType)
96 {
97 return (inputValue.IndexOf(comparisonValue, comparisonType) != -1);
98 }
99
100 /// <summary>
101 /// Loads the string into a LINQ to XML XDocument
102 /// </summary>
103 /// <param name="xml">The XML string.</param>
104 /// <returns>The XML document object model (XDocument)</returns>
105 public static XDocument ToXDocument(this string xml)
106 {
107 return XDocument.Parse(xml);
108 }
109
110 /// <summary>
111 /// Loads the string into a XML DOM object (XmlDocument)
112 /// </summary>
113 /// <param name="xml">The XML string.</param>
114 /// <returns>The XML document object model (XmlDocument)</returns>
115 public static XmlDocument ToXmlDOM(this string xml)
116 {
117 var document = new XmlDocument();
118
119 document.LoadXml(xml);
120
121 return document;
122 }
123
124 /// <summary>
125 /// Loads the string into a XML XPath DOM (XPathDocument)
126 /// </summary>
127 /// <param name="xml">The XML string.</param>
128 /// <returns>The XML XPath document object model (XPathNavigator)</returns>
129 public static XPathNavigator ToXPath(this string xml)
130 {
131 var document = new XPathDocument(new StringReader(xml));
132
133 return document.CreateNavigator();
134 }
135
136 /// <summary>
137 /// Reverses / mirrors a string.
138 /// </summary>
139 /// <param name="value">The string to be reversed.</param>
140 /// <returns>The reversed string</returns>
141 public static string Reverse(this string value)
142 {
143 if (value.IsEmpty() || (value.Length == 1))
144 {
145 return value;
146 }
147
148 var chars = value.ToCharArray();
149
150 Array.Reverse(chars);
151
152 return new string(chars);
153 }
154
155 /// <summary>
156 /// Ensures that a string starts with a given prefix.
157 /// </summary>
158 /// <param name="value">The string value to check.</param>
159 /// <param name="prefix">The prefix value to check for.</param>
160 /// <returns>The string value including the prefix</returns>
161 /// <example>
162 /// <code>
163 /// var extension = "txt";
164 /// var fileName = string.Concat(file.Name, extension.EnsureStartsWith("."));
165 /// </code>
166 /// </example>
167 public static string EnsureStartsWith(this string value, string prefix)
168 {
169 if (value.StartsWith(prefix))
170 {
171 return value;
172 }
173
174 return string.Concat(prefix, value);
175 }
176
177 /// <summary>
178 /// Ensures that a string ends with a given suffix.
179 /// </summary>
180 /// <param name="value">The string value to check.</param>
181 /// <param name="suffix">The suffix value to check for.</param>
182 /// <returns>The string value including the suffix</returns>
183 /// <example>
184 /// <code>
185 /// var url = "http://www.pgk.de";
186 /// url = url.EnsureEndsWith("/"));
187 /// </code>
188 /// </example>
189 public static string EnsureEndsWith(this string value, string suffix)
190 {
191 if (value.EndsWith(suffix))
192 {
193 return value;
194 }
195
196 return string.Concat(value, suffix);
197 }
198
199 #endregion
200
201 #region · Regex based extension methods ·
202
203 /// <summary>
204 /// Uses regular expressions to determine if the string matches to a given regex pattern.
205 /// </summary>
206 /// <param name="value">The input string.</param>
207 /// <param name="regexPattern">The regular expression pattern.</param>
208 /// <returns>
209 /// <c>true</c> if the value is matching to the specified pattern; otherwise, <c>false</c>.
210 /// </returns>
211 /// <example>
212 /// <code>
213 /// var s = "12345";
214 /// var isMatching = s.IsMatchingTo(@"^\d+$");
215 /// </code>
216 /// </example>
217 public static bool IsMatchingTo(this string value, string regexPattern)
218 {
219 return IsMatchingTo(value, regexPattern, RegexOptions.None);
220 }
221
222 /// <summary>
223 /// Uses regular expressions to determine if the string matches to a given regex pattern.
224 /// </summary>
225 /// <param name="value">The input string.</param>
226 /// <param name="regexPattern">The regular expression pattern.</param>
227 /// <param name="options">The regular expression options.</param>
228 /// <returns>
229 /// <c>true</c> if the value is matching to the specified pattern; otherwise, <c>false</c>.
230 /// </returns>
231 /// <example>
232 /// <code>
233 /// var s = "12345";
234 /// var isMatching = s.IsMatchingTo(@"^\d+$");
235 /// </code>
236 /// </example>
237 public static bool IsMatchingTo(this string value, string regexPattern, RegexOptions options)
238 {
239 return Regex.IsMatch(value, regexPattern, options);
240 }
241
242 /// <summary>
243 /// Uses regular expressions to replace parts of a string.
244 /// </summary>
245 /// <param name="value">The input string.</param>
246 /// <param name="regexPattern">The regular expression pattern.</param>
247 /// <param name="replaceValue">The replacement value.</param>
248 /// <returns>The newly created string</returns>
249 /// <example>
250 /// <code>
251 /// var s = "12345";
252 /// var replaced = s.ReplaceWith(@"\d", m => string.Concat(" -", m.Value, "- "));
253 /// </code>
254 /// </example>
255 public static string ReplaceWith(this string value, string regexPattern, string replaceValue)
256 {
257 return ReplaceWith(value, regexPattern, replaceValue, RegexOptions.None);
258 }
259
260 /// <summary>
261 /// Uses regular expressions to replace parts of a string.
262 /// </summary>
263 /// <param name="value">The input string.</param>
264 /// <param name="regexPattern">The regular expression pattern.</param>
265 /// <param name="replaceValue">The replacement value.</param>
266 /// <param name="options">The regular expression options.</param>
267 /// <returns>The newly created string</returns>
268 /// <example>
269 /// <code>
270 /// var s = "12345";
271 /// var replaced = s.ReplaceWith(@"\d", m => string.Concat(" -", m.Value, "- "));
272 /// </code>
273 /// </example>
274 public static string ReplaceWith(this string value, string regexPattern, string replaceValue, RegexOptions options)
275 {
276 return Regex.Replace(value, regexPattern, replaceValue, options);
277 }
278
279 /// <summary>
280 /// Uses regular expressions to replace parts of a string.
281 /// </summary>
282 /// <param name="value">The input string.</param>
283 /// <param name="regexPattern">The regular expression pattern.</param>
284 /// <param name="evaluator">The replacement method / lambda expression.</param>
285 /// <returns>The newly created string</returns>
286 /// <example>
287 /// <code>
288 /// var s = "12345";
289 /// var replaced = s.ReplaceWith(@"\d", m => string.Concat(" -", m.Value, "- "));
290 /// </code>
291 /// </example>
292 public static string ReplaceWith(this string value, string regexPattern, MatchEvaluator evaluator)
293 {
294 return ReplaceWith(value, regexPattern, RegexOptions.None, evaluator);
295 }
296
297 /// <summary>
298 /// Uses regular expressions to replace parts of a string.
299 /// </summary>
300 /// <param name="value">The input string.</param>
301 /// <param name="regexPattern">The regular expression pattern.</param>
302 /// <param name="options">The regular expression options.</param>
303 /// <param name="evaluator">The replacement method / lambda expression.</param>
304 /// <returns>The newly created string</returns>
305 /// <example>
306 /// <code>
307 /// var s = "12345";
308 /// var replaced = s.ReplaceWith(@"\d", m => string.Concat(" -", m.Value, "- "));
309 /// </code>
310 /// </example>
311 public static string ReplaceWith(this string value, string regexPattern, RegexOptions options, MatchEvaluator evaluator)
312 {
313 return Regex.Replace(value, regexPattern, evaluator, options);
314 }
315
316 /// <summary>
317 /// Uses regular expressions to determine all matches of a given regex pattern.
318 /// </summary>
319 /// <param name="value">The input string.</param>
320 /// <param name="regexPattern">The regular expression pattern.</param>
321 /// <returns>A collection of all matches</returns>
322 public static MatchCollection GetMatches(this string value, string regexPattern)
323 {
324 return GetMatches(value, regexPattern, RegexOptions.None);
325 }
326
327 /// <summary>
328 /// Uses regular expressions to determine all matches of a given regex pattern.
329 /// </summary>
330 /// <param name="value">The input string.</param>
331 /// <param name="regexPattern">The regular expression pattern.</param>
332 /// <param name="options">The regular expression options.</param>
333 /// <returns>A collection of all matches</returns>
334 public static MatchCollection GetMatches(this string value, string regexPattern, RegexOptions options)
335 {
336 return Regex.Matches(value, regexPattern, options);
337 }
338
339 /// <summary>
340 /// Uses regular expressions to determine all matches of a given regex pattern and returns them as string enumeration.
341 /// </summary>
342 /// <param name="value">The input string.</param>
343 /// <param name="regexPattern">The regular expression pattern.</param>
344 /// <returns>An enumeration of matching strings</returns>
345 /// <example>
346 /// <code>
347 /// var s = "12345";
348 /// foreach(var number in s.GetMatchingValues(@"\d")) {
349 /// Console.WriteLine(number);
350 /// }
351 /// </code>
352 /// </example>
353 public static IEnumerable<string> GetMatchingValues(this string value, string regexPattern)
354 {
355 return GetMatchingValues(value, regexPattern, RegexOptions.None);
356 }
357
358 /// <summary>
359 /// Uses regular expressions to determine all matches of a given regex pattern and returns them as string enumeration.
360 /// </summary>
361 /// <param name="value">The input string.</param>
362 /// <param name="regexPattern">The regular expression pattern.</param>
363 /// <param name="options">The regular expression options.</param>
364 /// <returns>An enumeration of matching strings</returns>
365 /// <example>
366 /// <code>
367 /// var s = "12345";
368 /// foreach(var number in s.GetMatchingValues(@"\d")) {
369 /// Console.WriteLine(number);
370 /// }
371 /// </code>
372 /// </example>
373 public static IEnumerable<string> GetMatchingValues(this string value, string regexPattern, RegexOptions options)
374 {
375 foreach (Match match in GetMatches(value, regexPattern, options))
376 {
377 if (match.Success)
378 {
379 yield return match.Value;
380 }
381 }
382 }
383
384 /// <summary>
385 /// Uses regular expressions to split a string into parts.
386 /// </summary>
387 /// <param name="value">The input string.</param>
388 /// <param name="regexPattern">The regular expression pattern.</param>
389 /// <returns>The splitted string array</returns>
390 public static string[] Split(this string value, string regexPattern)
391 {
392 return value.Split(regexPattern, RegexOptions.None);
393 }
394
395 /// <summary>
396 /// Uses regular expressions to split a string into parts.
397 /// </summary>
398 /// <param name="value">The input string.</param>
399 /// <param name="regexPattern">The regular expression pattern.</param>
400 /// <param name="options">The regular expression options.</param>
401 /// <returns>The splitted string array</returns>
402 public static string[] Split(this string value, string regexPattern, RegexOptions options)
403 {
404 return Regex.Split(value, regexPattern, options);
405 }
406
407 /// <summary>
408 /// Splits the given string into words and returns a string array.
409 /// </summary>
410 /// <param name="value">The input string.</param>
411 /// <returns>The splitted string array</returns>
412 public static string[] GetWords(this string value)
413 {
414 return value.Split(@"\W");
415 }
416
417 /// <summary>
418 /// Gets the nth "word" of a given string, where "words" are substrings separated by a given separator
419 /// </summary>
420 /// <param name="value">The string from which the word should be retrieved.</param>
421 /// <param name="index">Index of the word (0-based).</param>
422 /// <returns>
423 /// The word at position n of the string.
424 /// Trying to retrieve a word at a position lower than 0 or at a position where no word exists results in an exception.
425 /// </returns>
426 /// <remarks>Originally contributed by MMathews</remarks>
427 public static string GetWordByIndex(this string value, int index)
428 {
429 var words = value.GetWords();
430
431 if ((index < 0) || (index > words.Length - 1))
432 {
433 throw new IndexOutOfRangeException("The word number is out of range.");
434 }
435
436 return words[index];
437 }
438
439 #endregion
440
441 #region · Bytes & Base64 ·
442
443 /// <summary>
444 /// Converts the string to a byte-array using the default encoding
445 /// </summary>
446 /// <param name="value">The input string.</param>
447 /// <returns>The created byte array</returns>
448 public static byte[] ToBytes(this string value)
449 {
450 return value.ToBytes(null);
451 }
452
453 /// <summary>
454 /// Converts the string to a byte-array using the supplied encoding
455 /// </summary>
456 /// <param name="value">The input string.</param>
457 /// <param name="encoding">The encoding to be used.</param>
458 /// <returns>The created byte array</returns>
459 /// <example><code>
460 /// var value = "Hello World";
461 /// var ansiBytes = value.ToBytes(Encoding.GetEncoding(1252)); // 1252 = ANSI
462 /// var utf8Bytes = value.ToBytes(Encoding.UTF8);
463 /// </code></example>
464 public static byte[] ToBytes(this string value, Encoding encoding)
465 {
466 encoding = (encoding ?? Encoding.Default);
467 return encoding.GetBytes(value);
468 }
469
470 /// <summary>
471 /// Encodes the input value to a Base64 string using the default encoding.
472 /// </summary>
473 /// <param name="value">The input value.</param>
474 /// <returns>The Base 64 encoded string</returns>
475 public static string EncodeBase64(this string value)
476 {
477 return value.EncodeBase64(null);
478 }
479
480 /// <summary>
481 /// Encodes the input value to a Base64 string using the supplied encoding.
482 /// </summary>
483 /// <param name="value">The input value.</param>
484 /// <param name="encoding">The encoding.</param>
485 /// <returns>The Base 64 encoded string</returns>
486 public static string EncodeBase64(this string value, Encoding encoding)
487 {
488 encoding = (encoding ?? Encoding.UTF8);
489
490 var bytes = encoding.GetBytes(value);
491
492 return Convert.ToBase64String(bytes);
493 }
494
495 /// <summary>
496 /// Decodes a Base 64 encoded value to a string using the default encoding.
497 /// </summary>
498 /// <param name="encodedValue">The Base 64 encoded value.</param>
499 /// <returns>The decoded string</returns>
500 public static string DecodeBase64(this string encodedValue)
501 {
502 return encodedValue.DecodeBase64(null);
503 }
504
505 /// <summary>
506 /// Decodes a Base 64 encoded value to a string using the supplied encoding.
507 /// </summary>
508 /// <param name="encodedValue">The Base 64 encoded value.</param>
509 /// <param name="encoding">The encoding.</param>
510 /// <returns>The decoded string</returns>
511 public static string DecodeBase64(this string encodedValue, Encoding encoding)
512 {
513 encoding = (encoding ?? Encoding.UTF8);
514
515 var bytes = Convert.FromBase64String(encodedValue);
516
517 return encoding.GetString(bytes);
518 }
519
520 #endregion
521
522 #endregion
523 }
524 }