Can Javascript RegExp do partial case insensitivity?

后端 未结 5 566
我寻月下人不归
我寻月下人不归 2021-01-14 14:35

I want to know if Javascript RegExp has the ability to turn on and off case insensitivity within the regular expression itself. I know you can set the modifier for the entir

相关标签:
5条回答
  • 2021-01-14 14:45

    What you can do is build your regex like this :

    var str = "teXT To seArch";
    var r = new RegExp(
      str.split('').map(function(c){return '['+c.toLowerCase()+c.toUpperCase()+']'}).join('')
      + ' TOP SECRET'
    );
    
    0 讨论(0)
  • 2021-01-14 14:48

    According to this reference page, Javascript supports:

    No mode modifiers to set matching options within the regular expression.

    So the answer is no, you cannot turn case sensitivity on or off within the regular expression.

    0 讨论(0)
  • 2021-01-14 14:54

    You can write the RegExp in case-sensitive "longhand"

    /[tT][eE][xX][tT] [tT][oO] [sS][eE][aA][rR][cC][hH] TOP SECRET/
        .test('text to search TOP SECRET');
    // true
    

    An alternative approach is two regular expressions, an insensitive one followed by a strict one

    function test(str) {
        var m = str.match(/text to search (TOP SECRET)/i);
        return (m || false) && /TOP SECRET$/.test(m[1]);
    }
    
    test('text to search TOP SECRET'); // true
    test('text to search ToP SECRET'); // false
    

    Further, function test above can be optimised in this specific case (as the TOP SECRET part is effectively a string literal which will always have exactly the same form), it doesn't require a second full RegExp test to check it, i.e. you can do

    (m || false) && 'TOP SECRET' === m[1];
    
    0 讨论(0)
  • 2021-01-14 14:54

    Why not simply use 2 Regex's?

    var str = "teXT To seArcH TOP SECRET";
    if (/text to search/i.test(str) && /TOP SECRET/.test(str)) {
      console.log('match!');
    }
    

    I think there is rarely a good reason to make a single very complex regex to cover every case, when you could instead make a handful of Regex's which you combine with code logic. I'd much rather have small bite size Regex's from a maintenance point of view, as figuring what a complex regex actually does can be quite daunting.

    0 讨论(0)
  • 2021-01-14 14:58

    Don't think so. I'd suggest doing this:

    var m;
    var str = "teXT To seArcH TOP SECRET";
    if ((m = str.match(/text to search (top secret)/i)) && m[1].match(/TOP SECRET/)) {
      // matched.
    }
    
    0 讨论(0)
提交回复
热议问题