{"version":3,"sources":["../src/string/matcher.ts"],"names":["escapeRegexpStr","str","Matcher","rules","options","divider","charset","ignoreCase","assignObject","rule","deny","divChars","c","result","hasDeny","hasSure","matched"],"mappings":"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","file":"chunk-HGZ5FJAM.mjs","sourcesContent":["import { assignObject } from '../object/assignObject';\n/**\n * \n * 用来匹配一个字符串是否满足某种规则\n * \n * \n * \n * matcher([\"a\"]).test(\"a\")             // true,严格匹配\n * matcher([\"a\",\"b\"]).test(\"a\")         // true,严格匹配\n * matcher([\"!a\",\"b\"]).test(\"a\")        // false 严格匹配\n * matcher([\"!a\",\"b\"]).test(\"x\")        // false, 指定了肯定匹配和否定匹配时，!a代表不匹配a，\n * matcher([\"*\"])                       // 任意字符直到某个指定的字符结束\n * matcher([\"**\"])                      // 匹配任意字符,使用.*正则\n * matcher([\"?\"])                       // ?代表单个字符\n * \n * \n * \n */\n \nexport interface MatcherOptions{\n    ignoreCase?:boolean\n    divider?:string\n    charset?:string             // 指定?匹配的有效字符集，默认值时非空字符\n}\n\n/**\n * 将字符串里面的正则表达式特殊字符转义\n * 如.转义为\\.\n * @param str \n * @returns \n */\nfunction escapeRegexpStr(str:string):string{\n    return str.replace(/([.?*+^$[\\]\\\\(){}|-])/g, \"\\$1\")\n} \n\n\nexport class Matcher{\n    rules:[RegExp,boolean][] = []\n    constructor(rules:string | (RegExp | string)[] | RegExp ,options?:MatcherOptions){\n        if(!Array.isArray(rules)){\n            rules = [rules]\n        }\n        let {divider,charset,ignoreCase} = assignObject({\n            charset:\"[^\\s\\n]\",\n            ignoreCase:false,\n            divider:undefined\n        },options)\n\n        let regexFlags:string = 'g'\n        if(ignoreCase) regexFlags=regexFlags+\"i\"\n \n        this.rules=rules.map(rule=>{\n            if(typeof rule === \"string\"){\n                let  deny = false\n                if(rule.startsWith(\"!\")){\n                    deny = true\n                    rule = rule.slice(1)\n                }\n                rule = escapeRegexpStr(rule)\n                rule = rule.replace(/(?<!\\\\)\\?/g,charset)  \n                if(rule.includes(\"*\")){            \n                    if(divider){// 指定分割符时*匹配到分隔符为止              \n                        const divChars=Array.from(divider).map(c=>`\\\\${c}`)                        \n                        rule = rule.replace(/(?<!\\\\)\\*\\*/g,\".*\") \n                        rule = rule.replace(/(?<![\\\\\\.])\\*/g,\"(?<=(\"+divChars.join(\"|\")+\"|^))[^\"+divChars.join()+\"]+?(?=(\"+divChars.join(\"|\")+\"|$))\")\n                        //rule = rule.replace(/(?<![\\\\\\.])\\*/g,\"(?<=(\\\\\"+dividers+\"|^)).+?(?=(\\\\\"+divider+\"|$))\")\n                    }else{// 未指定分隔符时，*==**)   \n                        rule = rule.replace(/(?<!\\\\)\\*/g,\".*?\")  \n                    }                       \n                }                 // 单个字符\n                rule = `^${rule}$`\n                return [new RegExp(rule),deny]\n            }else if(rule instanceof RegExp){\n                return [rule,false]\n            }else{\n                throw new Error(\"rule must be string or RegExp\")\n            }\n        })\n        // 将否定规则排在前面\n        this.rules = this.rules.reduce<([RegExp, boolean])[]>((result,[rule,deny])=>{\n            if(deny){\n                result.unshift([rule,deny])\n            }else{\n                result.push([rule,deny])\n            }\n            return result\n        },[] ) \n    }\n    test(str:string):boolean{\n        if(this.rules.length === 0) return true\n        let hasDeny = false,hasSure = false\n        for(const [rule,deny] of this.rules){\n            let matched = rule.test(str)\n            if(deny){\n                hasDeny = true\n                if(matched) return false\n            }else{\n                hasSure = true\n                if(matched) return true\n            }\n        }        \n        // 当所有规则都不匹配时\n        // 如果只有否定规则，返回true\n        // 如果只有肯定规则，返回false\n        // 如果有肯定规则和否定规则，返回false\n        return  hasDeny && hasSure ? false : hasDeny\n    }\n}\n\n "]}