|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- # regextras
-
- Array extras for regular expressions.
-
- Also provides optional `String` and `RegExp` prototype extensions.
-
- No more writing the implementation-detail-leaking, non-semantic, and
- otherwise ugly:
-
- ```js
- let matches;
- while ((matches = regex.exec(str)) !== null) {
- // Do something
- if (condition) {
- break;
- }
- }
- ```
-
- While all of the array extras could be useful, `some`, might be the most
- general purpose as it (as with `every`) allows short-circuiting (breaking).
-
- The following is equivalent to that above (though with `matches` as local):
-
- ```js
- RegExtras(regex).some(str, (matches) => {
- // Do something
- if (condition) {
- return true;
- }
- return false;
- });
- ```
-
- And if the condition is at the end of the loop, just this:
-
- ```js
- RegExtras(regex).some(str, (matches) => {
- // Do something
- return condition;
- });
- ```
-
- ## Installation
-
- Node:
-
- ```js
- const RegExtras = require('regextras');
- ```
-
- Modern browsers:
-
- ```js
- import {RegExtras} from './node_modules/regextras/dist/index-es.js';
- ```
-
- Older browsers:
-
- ```html
- <script src="regextras/dist/index-umd.js"></script>
- ```
-
- The prototype versions must be required or included separately.
-
- If you need the generator methods, you should also add the following:
-
- ```html
- <script src="regextras/dist/index-generators-umd.js"></script>
- ```
-
- ## API
-
- ### Constructor
-
- `new RegExtras(regex, flags, newLastIndex)`
-
- Example:
-
- ```js
- const piglatinArray = RegExtras(/\w*w?ay/).reduce('ouyay areway illysay', function (arr, i, word) {
- if (word.endsWith('way')) { arr.push(word.replace(/way$/, '')); } else { arr.push(word.slice(-3, -2) + word.slice(0, -3)); }
- return arr;
- }, []);
- ```
-
- All arguments but the first are optional, and the first argument can be
- expressed as a string.
-
- The `new` keywords is not required.
-
- ### Instance methods
-
- These methods (and their callbacks) behave like the [array extra](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#Iteration_methods)
- to which they correspond with exceptions detailed below.
-
- - ***forEach(str, callback, thisObject)*** - Unlike the other extras, this
- method returns the RegExtras object (to enable chaining).
-
- - ***some(str, callback, thisObject)***
-
- - ***every(str, callback, thisObject)***
-
- - ***map(str, callback, thisObject)***
-
- - ***filter(str, callback, thisObject)***
-
- - ***reduce(str, cb, prev, thisObj)*** - Unlike the array extras, allows a
- fourth argument to set an alternative value for `this` within the callback.
-
- - ***reduceRight(str, cb, prev, thisObj)*** - Unlike the array extras,
- allows a fourth argument to set an alternative value for `this` within
- the callback.
-
- - ***find(str, cb, thisObj)***
-
- - ***findIndex(str, cb, thisObj)***
-
- Also adds the following methods:
-
- - ***findExec(str, cb, thisObj)*** - Operates like `find()` except that it
- returns the `exec` result array (with `index` and `input` as well as
- numeric properties as returned by [RegExp.prototype.exec](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec)).
-
- - ***filterExec(str, cb, thisObj)*** - Operates like `filter()` except that
- the resulting array will contain the full `exec` results.
-
- If you are using the Node version (or if, for the browser, you add the
- `index-generators.js` file and you are only supporting modern browsers), one
- can use the following generator methods:
-
- - ***values(str)*** - Returns an iterator with the array of matches (for each
- `RegExp.prototype.exec` result)
-
- - ***keys(str)*** - Returns an iterator with 0-based indexes (from
- `RegExp.prototype.exec` result)
-
- - ***entries(str)*** - Returns an iterator with an array containing the
- key and the array of matches (for each `RegExp.prototype.exec` result)
-
- ### Class methods
-
- - ***mixinRegex(regex, newFlags='', newLastIndex=regex.lastIndex)*** -
- Makes a copy of a regular expression.
-
- ### Callbacks
-
- All callbacks follow the signature:
-
- `cb(n1, n2..., i, n0);`
-
- ...except for the `reduce` and `reduceRight` callbacks which follow:
-
- `cb(prev, n1, n2..., i, n0);`
-
- ### Prototype versions
-
- `String` and `RegExp` versions of the above methods are also available.
-
- The `RegExp` prototype version acts in the same way as `RegExtra` just
- without the need for a separate constructor call.
-
- The `String` prototype version differs in that instead of the first argument
- being a string, it is the regular expression.
-
- ## Todos
-
- 1. Could add [Array accessor methods](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#Accessor_methods)
- like `slice()`, with an additional supplied regular expression to gather
- the `exec` results into an array.
-
- 2. Utilize `nodeunit` browser testing (and add `mixinRegex` tests)
-
- 1. Convert nodeunit tests to ES6 modules running through babel-register?;
- streamline as sole set of tests, reconciling `test` with `tests` folder
-
- 3. Add generators for prototype versions
|