如何在clojure中的正则表达式后对选定的字符串执行操作

时间:2016-12-23 00:27:20

标签: regex clojure

基本字符串:

SELECT (sum([column.one]) / sum([column.two])) AS [sum / sum], [column.three] AS [column.three] FROM [database.table] GROUP BY [column.three] ORDER BY [column.three] ASC

结果字符串:

SELECT (sum([column.one]) / sum([column.two])) AS [sum___sum], [column.three] AS [column.three] FROM [database.table] GROUP BY [column.three] ORDER BY [column.three] ASC

此处[sum / sum]可能会更改为其他格式,例如[sum * distinct][max + min - distinct]

到目前为止我所拥有的:

用_:

替换围绕它们的所有值[]

(s/replace sql #"\[(.*?)\]" "_")

我在尝试什么: 如果我能得到匹配的值,我可以用下划线替换除点(。)之外的所有特殊字符。

(s/replace sql #"\[(.*?)\]" #(s/replace "$1" #"[\/\*\-\+\(\)\\\s]" "_"))

更清晰: 简而言之,[]内的任何内容都只能是字母数字,点和下划线的组合。否则用下划线(_)替换该字符。

2 个答案:

答案 0 :(得分:1)

[重复我的评论回答]

在这种情况下" $ 1"不是有效的语法。 您正在尝试替换文字字符串" $ 1"中的某些内容,而不是匹配的字符串中的内容。您应该在第二个操作中通过第一个替换操作匹配。只需更换" $ 1"与@Injectable() export class OtherService { private _data: any; private url: string; constructor(private _http: Http, private locatorService: LocatorService) { this.url = this.locatorService.getConfig(); } public loadData(): model[] { return this._http.get(this.url.serviceUrl) .map(res => this._data = res.json()) .catch(error => Observable.throw(error.json().error || 'Server error')); } }

答案 1 :(得分:0)

丑陋的方式是将subs简单地分割为第一部分和第二部分。然后加你"总和___总和"这些部分之间。

如果要替换的部分总是第一个" AS ["在你的SQL查询字符串中。您可以使用它从字符串中找到正确的index-of。这样你就不需要regexp了。

如前所述,直接在查询中插入字符串可能会使用sql注入攻击数据库。

更好的方法是在原始查询中使用参数,或者将查询创建为预准备语句。