2

我正在尝试匹配冒号后面的子字符串:也不匹配冒号。这应该很简单。给定

select * from table where name=:name, id = :id order by :order_by limit :limit

它应该匹配

name
id
order_by
limit

但是,它是匹配的

:name
:id
:order_by
:limit

我正在使用的正则表达式是

:([a-zA-Z0-9_]+)

但我也试过

(?::)([a-zA-Z0-9_]+)

根据https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#special-non-capturing-parentheses

有人能帮我吗?

4

3 回答 3

2

您的正则表达式应该可以工作。假设您使用的是 JavaScript,您可以在matches数组中收集如下结果:

var myRe = /:(\w+)/g;
var str = "select * from table where name=:name, id = :id order by :order_by limit :limit";
var matches = [];
var myArray;
while ((myArray = myRe.exec(str)) !== null) {
  matches.push(myArray[1]);
}

见:http: //jsfiddle.net/6CB5Y/1/

myArray是一个数组,包含整个匹配项(例如 ':name')及其所有带括号的子字符串匹配项,如果有的话(例如 'name')。因此myArray[1],用于仅收集带括号的匹配项。

于 2013-06-16T21:52:57.470 回答
1

非捕获括号仍然用于形成$0或完全匹配,即

:name
+---+ 0
 +--+ 1

您可能想对这些占位符执行替换,因此我将通过使用替换功能来解决缺少后视的问题:

var bound = {
    name: 'test',
    id: 'world',
    order_by: 'col',
    limit: 123
},
sql = 'select * from table where name=:name, id = :id order by :order_by limit :limit';

sql.replace(/:(\w+)/g, function($0, $1) {
    // TODO apply escaping
    return bound[$1]; // perform lookup using 'name', 'id', etc.
});
// "select * from table where name=test, id = world order by col limit 123"
于 2013-06-16T22:49:55.650 回答
0

您只需要“回头看”:

(?<=:)\w+

后面的查看断言但没有捕捉到比赛之前发生的事情。

请注意整个匹配(不是您的正则表达式中的第 1 组)是您的目标。

还要注意简化:\w意味着完全[a-zA-Z0-9_]

查看在 rubular 上运行的这个正则表达式

于 2013-06-16T20:54:07.377 回答