【问题标题】:JavaScript Regex get multiple single quotation marks inside single quotation marks in a SQL insertJavaScript Regex 在 SQL 插入中的单引号内获取多个单引号
【发布时间】:2018-11-20 00:25:45
【问题描述】:

问题

我正在做一个数据库迁移,我遇到了以下情况,我在插入的单引号内有单引号,经过几次尝试修复后,我得出的结论是我需要使用正则表达式,然后我到了到我可以替换文本中心的单引号的地步,当它出现在开头时,我现在遇到了问题。我的正则表达式有前两个单引号,但我的目标是最后两个。

SQL 插入:

(1, '22', '2006-11-10', '3', 'field1', 'field2', '2006-12-12', '11:20:06', '''field3', '

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus ex ipsum, luctus id dignissim tempor, volutpat eget sapien. Cras accumsan molestie iaculis. Mauris vehicula a nunc vel tincidunt. 
 Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. 

    - Lorem ipsum dolor '' sit amet - ''''

 Aliquam vestibulum tincidunt odio, id varius sapien lacinia ac. Phasellus ullamcorper ante ut lacus dictum commodo.
  Integer sit amet lacus ornare massa feugiat tempus. 

', null, null);

我的正则表达式(js):

((["'])(?:(?=(\'\'\?))\2)*?)\1(?!,)

我在进行正则表达式并进行查找和替换后的目标是得到这个结果:

(1, '22', '2006-11-10', '3', 'field1', 'field2', '2006-12-12', '11:20:06', '\'\'field3', '

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus ex ipsum, luctus id dignissim tempor, volutpat eget sapien. Cras accumsan molestie iaculis. Mauris vehicula a nunc vel tincidunt. 
 Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. 

    - Lorem ipsum dolor \'\' sit amet - \'\'\'\'

 Aliquam vestibulum tincidunt odio, id varius sapien lacinia ac. Phasellus ullamcorper ante ut lacus dictum commodo.
  Integer sit amet lacus ornare massa feugiat tempus. 

', null, null);

我正在使用此站点进行测试:https://regex101.com/(已选择 javascript)

【问题讨论】:

    标签: javascript sql regex migration


    【解决方案1】:

    一种选择是匹配'" 分隔符,然后延迟重复直到再次匹配该分隔符后跟逗号(或),以防万一item 是列表中的最后一个)。然后,使用替换函数将分隔符内的所有内容替换为 's 转义:

    const input = `(1, '22', '2006-11-10', '3', 'field1', 'field2', '2006-12-12', '11:20:06', '''field3', '
    
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus ex ipsum, luctus id dignissim tempor, volutpat eget sapien. Cras accumsan molestie iaculis. Mauris vehicula a nunc vel tincidunt. 
     Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. 
    
        - Lorem ipsum dolor '' sit amet - ''''
    
     Aliquam vestibulum tincidunt odio, id varius sapien lacinia ac. Phasellus ullamcorper ante ut lacus dictum commodo.
      Integer sit amet lacus ornare massa feugiat tempus. 
    
    ', null, null);`;
    
    
    const output = input.replace(
      /(["'])([\s\S]*?)\1(?=[,)])/g,
      (_, delim, content) => delim + content.replace(/'/g, "\\'") + delim
    );
    console.log(output);

    https://regex101.com/r/RRmq8g/1

    如果您想在分隔符为" 时像这样转义"s,则从delim 构造替换正则表达式:

    const output = input.replace(
      /(["'])([\s\S]*?)\1(?=[,)])/g,
      (_, delim, content) => {
        const pattern = new RegExp(delim, 'g')
        return delim + content.replace(pattern, '\\' + delim) + delim
      }
    );
    

    const input = `(1, "22 foo bar "double quotes" here ", '2006-11-10', '3', 'field1', 'field2', '2006-12-12', '11:20:06', '''field3', '
    
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus ex ipsum, luctus id dignissim tempor, volutpat eget sapien. Cras accumsan molestie iaculis. Mauris vehicula a nunc vel tincidunt. 
     Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. 
    
        - Lorem ipsum dolor '' sit amet - ''''
    
     Aliquam vestibulum tincidunt odio, id varius sapien lacinia ac. Phasellus ullamcorper ante ut lacus dictum commodo.
      Integer sit amet lacus ornare massa feugiat tempus. 
    
    ', null, null);`;
    
    
    const output = input.replace(
      /(["'])([\s\S]*?)\1(?=[,)])/g,
      (_, delim, content) => {
        const pattern = new RegExp(delim, 'g')
        return delim + content.replace(pattern, '\\' + delim) + delim
      }
    );
    console.log(output);

    /(["'])([\s\S]*?)\1(?=[,)])/g 表示:

    • (["']) 匹配并捕获分隔符
    • ([\s\S]*?) - 重复任何字符,直到你到达:
    • \1 - 分隔符,后跟
    • (?=[,)]) - 逗号或)

    【讨论】:

      猜你喜欢
      • 2013-03-24
      • 2016-02-16
      • 2023-03-25
      • 2019-07-20
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多