8
回答
一个很有意思的字符串替换问题
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

需要做一个字符串替换功能,例如,将如下原始字符串替换为目标字符串:

原始字符串:
(age=ge=25,age=le=35);city==London;name==*Jack Huang*

目标字符串:
(age >= 25 or age <= 35) and city = 'London' and name like '%Jack Huang%'

其中,运算符与操作符的意义如下:

"=="      Equal
"!="      Not Equal
"=lt="    Less Than
"=le="    Less or Equal
"=gt="    Greater Than
"=ge="    Greater or Equal
";"       AND
","       OR

注意:若当 == 后带有 * 时,则需要替换为 like;对于字符串需要使用“单引号”括起来。

需要写一个正则表达式,从原始字符串中找出以下表达式:

age=ge=25
age=le=35
city==London
name==*Jack Huang*

请问大家,这个正则表达式应该怎样写呢?

<无标签>
举报
黄勇
发帖于3年前 8回/476阅
共有8个答案 最后回答: 3年前

针对你的数据,如果只是要提取出其中的表达式的话,用“/[^,;()]+/”就可以了。

--- 共有 3 条评论 ---
黄勇回复 @redraiment : 非常感谢! 3年前 回复
redraiment回复 @黄勇 : 取出来再分组即可。或者参看下面的JS代码。 3年前 回复
黄勇想法很不错!就是没法做 group 了,比如 age=ge=25,一共有三个 group,分别是:age、=ge=、25 3年前 回复
\w{1,}((=([lg]{1}[te]{1}){0,1}=)|(!=))([\*]{0,1}[\w\s]{1,}[\*]{0,1})勇哥不妨试试这个表达式
--- 共有 3 条评论 ---
黄勇回复 @Bieber : 可以为任意字符,包括空格,目前我是这样写的:(\w+)(==|!=|=lt=|=le=|=gt=|=ge=)([^,;()]+),排除了若干字符 3年前 回复
Bieber回复 @黄勇 : 好吧,这个中间的【+】是什么意思呀?不是Jack Huang吗? 3年前 回复
黄勇如果是 name==*Jack+Huang*,就不行了哦 3年前 回复

下面那个可读性高多了,上面那个表达式纯属累赘,你的系统里直接用下面那个不更好?

--- 共有 3 条评论 ---
乌龟壳你这个等于自己实现一套编解码罢了,应该没有本质区别 3年前 回复
乌龟壳URL的编解码无论是浏览器的<form>还是js还是服务器端都是基础的功能,直接用URL的编解码功能就行了嘛。 3年前 回复
黄勇由于需要在 URL 中使用,所以想利用一些 URL 无需编码的字符来表示 3年前 回复
弱弱的问一句,这个正则可写吗?哈。当然只是找到那几个字符串还是可以滴。。
--- 共有 2 条评论 ---
Timco关注这个问题挺久了,这个可以用编译原理词法分析中的非确定性有穷自动机来写。 3年前 回复
黄勇就是想看看能否通过正则表达式来获取 3年前 回复

给一个JavaScript的解决方案:

var operators = {
    "==": "=",
    "!=": "<>",
    "=lt=": "<",
    "=le=": "<=",
    "=gt=": ">",
    "=ge=": ">="
};

var s = '(age=ge=25,age=le=35);city==London;name==*Jack Huang*';
s.replace(/(!=|=(?:ge|le|lt|gt)?=)([^,;()]+)/g, function(_, op, right) {
    op = operators[op];
    if (!/\d+/.test(right)) {
        right = "'" + right + "'";
        if (op === '=' && right.indexOf('*') >= 0) {
            right = right.replace(/\*/g, '%');
            op = 'like';
        }
    }
    return ' ' + op + ' ' + right;
}).replace(/;/g, ' and ').replace(/,/g, ' or ');
输出结果:
(age >= 25 or age <= 35) and city = 'London' and name like '%Jack Huang%'



--- 共有 1 条评论 ---
黄勇非常感谢!我是这样写的正则表达式:(\w+)(==|!=|=lt=|=le=|=gt=|=ge=)([^,;()]+),用它来提取关系运算表达式 3年前 回复
亮点是黄大仙头像,怎么又换回来了!!!
--- 共有 1 条评论 ---
黄勇小伙伴们告诉我,这张头像让我成为了他们心中的呕像,所以我换回来了。。。 3年前 回复
顶部