如何使用正则表达式忽略查询字符串中的空白字符?
解决方法
你的问题出在IN子句中元素之间的空白导致split后出现异常值,以下两种方案都可以解决:
方案一:修改分割逻辑(轻量调整)
无需改动原正则,仅优化数组分割时的处理逻辑,即可消除空白干扰:
const regex = /((?:\bNOT\s+)?\w+)\s+IN\s+\('([^()]*)'\)/g; const string = "DEVICE_SIZE IN ('036','048', '060','070') AND DEVICE_VOLTAGE IN ('1','3') AND NOT DEVICE_DISCHARGE_AIR IN ('S') AND NOT DEVICE_REFRIGERANT_CIRCUIT IN ('H', 'C')"; const data = Array.from( string.matchAll(regex), m => ({ [m[1]]: m[2].split(/\s*','/).map(item => item.trim()) }) ); console.log(data);
这里把原有的split("','")替换为split(/\s*','/).map(item => item.trim()):
- 用正则匹配
','前后的任意空白字符,确保分割不受空格位置影响 - 对每个分割后的元素执行
trim(),彻底清除首尾残留的空白
方案二:更健壮的正则匹配(推荐)
换一种思路,直接匹配单引号包裹的元素,避免split的局限性,适配更复杂的空白格式:
const regex = /((?:\bNOT\s+)?\w+)\s+IN\s+\(([^)]+)\)/g; const string = "DEVICE_SIZE IN ('036','048', '060','070') AND DEVICE_VOLTAGE IN ('1','3') AND NOT DEVICE_DISCHARGE_AIR IN ('S') AND NOT DEVICE_REFRIGERANT_CIRCUIT IN ('H', 'C')"; const data = Array.from( string.matchAll(regex), ([_, key, valuesStr]) => { const values = Array.from(valuesStr.matchAll(/'([^']+)'/g), ([_, val]) => val.trim()); return { [key]: values }; } ); console.log(data);
这种方式的核心逻辑:
- 先匹配字段名和整个括号内的内容
- 用嵌套正则提取每个单引号内的元素值
- 对每个元素值执行
trim()清除空白
无论IN子句中是单个空格、多个空格还是换行,都能稳定输出正确结果:
[ { DEVICE_SIZE: [ '036', '048', '060', '070' ] }, { DEVICE_VOLTAGE: [ '1', '3' ] }, { 'NOT DEVICE_DISCHARGE_AIR': [ 'S' ] }, { 'NOT DEVICE_REFRIGERANT_CIRCUIT': [ 'H', 'C' ] } ]
内容的提问来源于stack exchange,提问作者Hello World
相关产品推荐
相关产品推荐

