首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex匹配逗号而不是锈迹中的引号

Regex匹配逗号而不是锈迹中的引号
EN

Stack Overflow用户
提问于 2020-10-07 02:55:23
回答 2查看 762关注 0票数 0

我对这个正则箱生锈有一点小问题。我需要匹配所有的‘:字’字符串,但不是在引号内。

不幸的是,像这个(?!\B"[^"]*)(:[a-zA-Z0-9]{1,})(?![^"]*"\B) (发现这里 )这样的方法不能工作,返回look-around, including look-ahead and look-behind, is not supported错误。

现在,我可以使用这个regex:(:[a-zA-Z0-9]{1,})匹配所有的':word‘字符串

代码语言:javascript
复制
let rparams = Regex::new(r#"(:[a-zA-Z0-9]{1,})"#).unwrap(); // doesn't work: match the ':20'

let raw_sql = "select * from aa where a = '10-10-10 20:20'; select * from aa where a = :num";

println!("{}", rparams.replace_all(raw_sql, "?").to_string()); 
// Returns: select * from aa where a = '10-10-10 20?'; select * from aa where a = ?
// Expected: select * from aa where a = '10-10-10 20:20'; select * from aa where a = ?

这段代码正在运行

谢谢你的帮助

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-07 04:33:54

正则表达式:在引号之间不匹配单词中描述的解决方案中,您似乎可以通过匹配要替换的部分来完成这一任务,同时还可以匹配和捕获您想忽略的部分(引号中的文本)。

必需的正则表达式是('[^']*')|:\w+ -- regex101实例

这将match+capture任何包含任何其他字符的单引号,并匹配任何冒号:,后面跟着一个或多个单词字符。

然后,使用带有置换器关闭replace_all检查捕获组:如果有捕获组,则它将是匹配的引号,因此将其替换为自身;如果没有捕获组,则为匹配关键字,因此使用所需的值替换它。

示例:

代码语言:javascript
复制
use regex::{Regex, Captures};

fn main() {
    let rparams = Regex::new(r#"('[^']*')|:\w+"#).unwrap();

    let raw_sql = "select * from aa where a = '10-10-10 20:20'; select * from aa where a = :num";
    println!("{}", rparams.replace_all(raw_sql, |caps: &Captures| {
        match caps.get(1) {
            Some(same) => same.as_str().to_string(),
            None => "?".to_string()
        }
    }).to_string());
}

操场连接

备注:

  1. 在您的示例中使用了[a-zA-Z0-9],但是\w (与[a-zA-Z0-9_]相同)似乎更合理,因为它允许像:num_one这样的东西。
  2. 只有在字符串中有平衡引号的情况下,这才有效。
  3. 如果引号中有转义引号,这是行不通的(但是可以用一个更复杂的正则表达式来实现,如链接问题中所示)。
票数 2
EN

Stack Overflow用户

发布于 2020-10-07 03:41:52

我认为你的问题超出了正则表达式的能力。我认为最简单的声音方法是编写一个记号器,按顺序检查字符串中的所有标记,每次一个。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64236537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档