Skip to content

Instantly share code, notes, and snippets.

@nikolaifedorov
Last active August 29, 2015 14:15
Show Gist options
  • Save nikolaifedorov/51735c7a807b0a635755 to your computer and use it in GitHub Desktop.
Save nikolaifedorov/51735c7a807b0a635755 to your computer and use it in GitHub Desktop.
RegExp.clone = function (regExp) {
var pattern = regExp.source,
isGlobal = regExp.global,
isIgnoreCase = regExp.ignoreCase,
isMultiline = regExp.multiline;
flags = '';
flags += isGlobal ? 'g' : '';
flags += isIgnoreCase ? 'i' : '';
flags += isMultiline ? 'm' : '';
return new RegExp(pattern, flags);
};
RegExp.prototype.clone = function () {
return RegExp.clone(this);
};
// Example:
/*
* var regex = /^[abc]/gim,
* cloneRegex1 = regex.clone(),
* cloneRegex2 = RegExp.clone(regex);
*
*
* regex.exec("ZZ\nZZCZ\nCZZ\na"); // => ["C"]
* cloneRegex1.exec("ZZ\nZZCZ\nCZZ\na"); // => ["C"]
* cloneRegex2.exec("ZZ\nZZCZ\nCZZ\na"); // => ["C"]
*
* regex.exec("ZZ\nZZCZ\nCZZ\na"); // => ["a"]
* cloneRegex1.exec("ZZ\nZZCZ\nCZZ\na"); // => ["a"]
* cloneRegex2.exec("ZZ\nZZCZ\nCZZ\na"); // => ["a"]
*
* regex === regex // => true
* regex === cloneRegex1 // => false
* regex === cloneRegex2 // => false
* cloneRegex1 === cloneRegex2 // => false
*
*/
@nikolaifedorov
Copy link
Author

Если нужно сохранить и позицию, то

RegExp.clone = function (regExp) {
    var pattern = regExp.source,
        isGlobal = regExp.global,
        isIgnoreCase = regExp.ignoreCase,
        isMultiline = regExp.multiline;
        flags = '',
        clone;

    flags += isGlobal ? 'g' : '';
    flags += isIgnoreCase ? 'i' : '';
    flags += isMultiline ? 'm' : '';

    clone = new RegExp(pattern, flags);
    clone.lastIndex = regExp.lastIndex;

    return clone;
};

RegExp.prototype.clone = function () {
    return RegExp.clone(this);
};

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment