Adds utility methods to NSString, for dealing with whitespace, string splitting, and other things.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. //
  2. // NSString+SA_NSStringExtensions.h
  3. //
  4. // Copyright 2015-2021 Said Achmiz.
  5. // See LICENSE and README.md for more info.
  6. #import <Foundation/Foundation.h>
  7. /********************************************************/
  8. #pragma mark - SA_NSStringExtensions category declaration
  9. /********************************************************/
  10. @interface NSString (SA_NSStringExtensions)
  11. /******************************/
  12. #pragma mark - Class properties
  13. /******************************/
  14. @property (class) BOOL SA_NSStringExtensions_RaiseRegularExpressionCreateException;
  15. /*************************************/
  16. #pragma mark - Working with characters
  17. /*************************************/
  18. /* Testing for occurrences of specified characters.
  19. */
  20. -(BOOL) containsCharactersInSet:(NSCharacterSet *)characters;
  21. -(BOOL) containsCharactersInString:(NSString *)characters;
  22. /* Removing occurrences of specified characters.
  23. */
  24. -(NSString *) stringByRemovingCharactersInSet:(NSCharacterSet *)characters;
  25. -(NSString *) stringByRemovingCharactersInString:(NSString *)characters;
  26. /**********************/
  27. #pragma mark - Trimming
  28. /**********************/
  29. typedef NS_OPTIONS(NSUInteger, SA_NSStringTrimmingOptions) {
  30. SA_NSStringTrimming_CollapseWhitespace = 1 << 0,
  31. SA_NSStringTrimming_TrimWhitespace = 1 << 1,
  32. SA_NSStringTrimming_AppendEllipsis = 1 << 2,
  33. SA_NSStringTrimming_ElideEllipsisWhenEmpty = 1 << 3
  34. };
  35. /* “Smart” trimming.
  36. */
  37. -(NSString *) stringByTrimmingToMaxLengthInBytes:(NSUInteger)maxLengthInBytes
  38. usingEncoding:(NSStringEncoding)encoding
  39. withStringEnumerationOptions:(NSStringEnumerationOptions)enumerationOptions
  40. andStringTrimmingOptions:(SA_NSStringTrimmingOptions)trimmingOptions;
  41. /******************************************************************************/
  42. /* Construct trimmed and cleaned string from component dictionary array.
  43. *
  44. * Component dictionary keys:
  45. *
  46. * value
  47. * The string value of the component.
  48. *
  49. * appendFormat (optional)
  50. * A format string, with exactly one format specifier, which must be
  51. * ‘%@’; this will be replaced with the string value.
  52. *
  53. * priority
  54. * Priority. Lower values mean higher priority. Must be an integer.
  55. * (Equal-priority components are NOT guaranteed to be trimmed in
  56. * array order.)
  57. *
  58. * limit (optional)
  59. * Individual length limit for the given component. If present, the
  60. * string value (NOT the full formatted component!) will be trimmed to
  61. * the given length limit *before* the components are formatted and
  62. * combined.
  63. *
  64. * trimBy (optional)
  65. * Wrapped NSStringEnumerationOptions flags value. Specifies the unit
  66. * by which to trim (character, word, etc.) Components without a value
  67. * for this key are not trimmed, only (if need be) removed entirely.
  68. * NOTE: This means that if you specify a value for they ‘limit’ key,
  69. * you MUST specify a value for this key also, otherwise the limit
  70. * will be ignored!)
  71. ******************************************************************************/
  72. +(instancetype) trimmedStringFromComponents:(NSArray <NSDictionary *> *)components
  73. maxLength:(NSUInteger)maxLengthInBytes
  74. encoding:(NSStringEncoding)encoding
  75. cleanWhitespace:(BOOL)cleanWhitespace;
  76. /****************************************/
  77. #pragma mark - Partitioning by whitespace
  78. /****************************************/
  79. /* Finding runs of whitespace.
  80. */
  81. -(NSRange) firstWhitespaceAfterRange:(NSRange)aRange;
  82. -(NSRange) firstNonWhitespaceAfterRange:(NSRange)aRange;
  83. -(NSRange) lastWhitespaceBeforeRange:(NSRange)aRange;
  84. -(NSRange) lastNonWhitespaceBeforeRange:(NSRange)aRange;
  85. /********************/
  86. #pragma mark - Ranges
  87. /********************/
  88. /* Range manipulation.
  89. */
  90. -(NSRange) rangeAfterRange:(NSRange)aRange;
  91. -(NSRange) rangeFromEndOfRange:(NSRange)aRange;
  92. -(NSRange) rangeToEndFrom:(NSRange)aRange;
  93. @property (readonly) NSRange startRange;
  94. @property (readonly) NSRange fullRange;
  95. @property (readonly) NSRange endRange;
  96. /***********************/
  97. #pragma mark - Splitting
  98. /***********************/
  99. /* Splitting by whitespace.
  100. */
  101. -(NSArray <NSString *> *) componentsSplitByWhitespace;
  102. -(NSArray <NSString *> *) componentsSplitByWhitespaceWithMaxSplits:(NSUInteger)maxSplits;
  103. -(NSArray <NSString *> *) componentsSplitByWhitespaceWithMaxSplits:(NSUInteger)maxSplits
  104. dropEmptyString:(BOOL)dropEmptyString;
  105. /* Splitting by specified delimiter string.
  106. */
  107. -(NSArray <NSString *> *) componentsSeparatedByString:(NSString *)separator
  108. maxSplits:(NSUInteger)maxSplits;
  109. -(NSArray <NSString *> *) componentsSeparatedByString:(NSString *)separator
  110. dropEmptyString:(BOOL)dropEmptyString;
  111. /***************************/
  112. #pragma mark - Byte encoding
  113. /***************************/
  114. /* Convenience method; alias for lengthOfBytesUsingEncoding:NSUTF8StringEncoding.
  115. */
  116. @property (readonly) NSUInteger UTF8length;
  117. /* Convenience method; alias for dataWithEncoding:NSUTF8StringEncoding.
  118. */
  119. @property (nonatomic, readonly) NSData *dataAsUTF8;
  120. /* Convenience method; alias for [[foo alloc] initWithData:data encoding:encoding].
  121. */
  122. +(instancetype) stringWithData:(NSData *)data
  123. encoding:(NSStringEncoding)encoding;
  124. /* Convenience method; alias for stringWithData:data encoding:NSUTF8StringEncoding.
  125. */
  126. +(instancetype) stringWithUTF8Data:(NSData *)data;
  127. /*********************/
  128. #pragma mark - Hashing
  129. /*********************/
  130. /* MD5 hashing.
  131. */
  132. @property (nonatomic, readonly) NSString *MD5Hash;
  133. /***********************/
  134. #pragma mark - Sentences
  135. /***********************/
  136. /* Get first sentence.
  137. */
  138. @property (nonatomic, readonly) NSString *firstSentence;
  139. /*********************/
  140. #pragma mark - Padding
  141. /*********************/
  142. /* Left-pad.
  143. */
  144. -(NSString *) stringLeftPaddedTo:(int)width;
  145. /****************************************************/
  146. #pragma mark - Regular expression convenience methods
  147. /****************************************************/
  148. -(NSRegularExpression *) regularExpression;
  149. -(NSRegularExpression *) regularExpressionWithOptions:(NSRegularExpressionOptions)options;
  150. -(NSArray <NSString *> *) matchesForRegex:(NSRegularExpression *)regex;
  151. -(NSArray <NSArray <NSString *> *> *) allMatchesForRegex:(NSRegularExpression *)regex;
  152. -(NSArray <NSString *> *) matchesForRegexPattern:(NSString *)pattern;
  153. -(NSArray <NSString *> *) matchesForRegexPattern:(NSString *)pattern
  154. options:(NSRegularExpressionOptions)options;
  155. -(NSArray <NSArray <NSString *> *> *) allMatchesForRegexPattern:(NSString *)pattern;
  156. -(NSArray <NSArray <NSString *> *> *) allMatchesForRegexPattern:(NSString *)pattern
  157. options:(NSRegularExpressionOptions)options;
  158. -(NSString *) stringByReplacingFirstOccurrenceOfPattern:(NSString *)pattern
  159. withTemplate:(NSString *)replacement;
  160. -(NSString *) stringByReplacingFirstOccurrenceOfPattern:(NSString *)pattern
  161. withTemplate:(NSString *)replacement
  162. regularExpressionOptions:(NSRegularExpressionOptions)regexpOptions
  163. matchingOptions:(NSMatchingOptions)matchingOptions;
  164. -(NSString *) stringByReplacingAllOccurrencesOfPattern:(NSString *)pattern
  165. withTemplate:(NSString *)replacement;
  166. -(NSString *) stringByReplacingAllOccurrencesOfPattern:(NSString *)pattern
  167. withTemplate:(NSString *)replacement
  168. regularExpressionOptions:(NSRegularExpressionOptions)regexpOptions
  169. matchingOptions:(NSMatchingOptions)matchingOptions;
  170. -(NSString *) stringByReplacingAllOccurrencesOfPatterns:(NSArray <NSString *> *)patterns
  171. withTemplates:(NSArray <NSString *> *)replacements;
  172. -(NSString *) stringByReplacingAllOccurrencesOfPatterns:(NSArray <NSString *> *)patterns
  173. withTemplates:(NSArray <NSString *> *)replacements
  174. regularExpressionOptions:(NSRegularExpressionOptions)regexpOptions
  175. matchingOptions:(NSMatchingOptions)matchingOptions;
  176. @end
  177. /**************************************************************************/
  178. #pragma mark - SA_NSStringExtensions category declaration (NSMutableString)
  179. /**************************************************************************/
  180. @interface NSMutableString (SA_NSStringExtensions)
  181. /*************************************/
  182. #pragma mark - Working with characters
  183. /*************************************/
  184. /* Removing occurrences of specified characters.
  185. */
  186. -(void) removeCharactersInSet:(NSCharacterSet *)characters;
  187. -(void) removeCharactersInString:(NSString *)characters;
  188. /**********************/
  189. #pragma mark - Trimming
  190. /**********************/
  191. /* “Smart” trimming.
  192. */
  193. -(void) trimToMaxLengthInBytes:(NSUInteger)maxLengthInBytes
  194. usingEncoding:(NSStringEncoding)encoding
  195. withStringEnumerationOptions:(NSStringEnumerationOptions)enumerationOptions
  196. andStringTrimmingOptions:(SA_NSStringTrimmingOptions)trimmingOptions;
  197. /*********************/
  198. #pragma mark - Padding
  199. /*********************/
  200. /* Left-pad.
  201. */
  202. -(void) leftPadTo:(int)width;
  203. /****************************************************/
  204. #pragma mark - Regular expression convenience methods
  205. /****************************************************/
  206. -(void) replaceFirstOccurrenceOfPattern:(NSString *)pattern
  207. withTemplate:(NSString *)replacement;
  208. -(void) replaceFirstOccurrenceOfPattern:(NSString *)pattern
  209. withTemplate:(NSString *)replacement
  210. regularExpressionOptions:(NSRegularExpressionOptions)regexpOptions
  211. matchingOptions:(NSMatchingOptions)matchingOptions;
  212. -(void) replaceAllOccurrencesOfPattern:(NSString *)pattern
  213. withTemplate:(NSString *)replacement;
  214. -(void) replaceAllOccurrencesOfPattern:(NSString *)pattern
  215. withTemplate:(NSString *)replacement
  216. regularExpressionOptions:(NSRegularExpressionOptions)regexpOptions
  217. matchingOptions:(NSMatchingOptions)matchingOptions;
  218. -(void) replaceAllOccurrencesOfPatterns:(NSArray <NSString *> *)patterns
  219. withTemplates:(NSArray <NSString *> *)replacements;
  220. -(void) replaceAllOccurrencesOfPatterns:(NSArray <NSString *> *)patterns
  221. withTemplates:(NSArray <NSString *> *)replacements
  222. regularExpressionOptions:(NSRegularExpressionOptions)regexpOptions
  223. matchingOptions:(NSMatchingOptions)matchingOptions;
  224. @end