Notepad ++正则表达式问题

时间:2014-08-30 00:21:55

标签: regex notepad++

我试图在插入语句中粘贴一些工作,并为mysqli预处理语句格式化它们。

以下是一个例子:

INSERT INTO 
products
(hash, name, description, large_img, small_img, label_img, category, small, large, small_price, large_price, best_seller, in_stock) 
VALUES 
([value-1],[value-2],[value-3],[value-4],[value-5],[value-6],[value-7],[value-8],[value-9],[value-10],[value-11],[value-12],[value-13])

所以我试了一个正则表达式:

find: (\[.*)(])


replace: ?

但它不是替换每个[value=*],而是替换所有这些仅仅在结束括号的最后一个实例处停止。为什么呢?

输出:

INSERT INTO 
products
(id, hash, name, description, large_img, small_img, label_img, category, small, large, small_price, large_price, best_seller, in_stock) 
VALUES 
(?)

我怎样才能让它正确地替换它。我的正则表达式不应该选择所有内容直到第一个结束括号,但为什么它会选择所有内容直到最后一个结束括号?

3 个答案:

答案 0 :(得分:2)

*greedy运算符,意味着它将尽可能多地匹配,并且仍然允许正则表达式的其余部分匹配。使用*?表示非贪婪匹配,表示“零或更多 - 最好尽可能少”。

(\[.*?)(])

注意:实际上不需要使用捕获组,因为您没有在替换呼叫中引用它们。

Find: \[.*?\]
Replace: ?

答案 1 :(得分:1)

不要忘记*是贪婪的,它会尽可能地尝试匹配,而是使用非贪婪的版本:

(\[.*?)(])

答案 2 :(得分:1)

正如其他人所说的那样,*是贪婪的,而*?是非贪婪的,只会拿起最低数量来匹配(这是你想要做的。)


但是,不要为PHP添加一串问号和逗号,为什么不要懒惰,让PHP自己生成它们:implode(',', array_fill(0, 13, '?'))

你需要很多代替13的东西,并且你有一套可靠的占位符,不会受到交错的拼写错误。

示例:

$placeholders = implode(',', array_fill(0, 13, '?'));

$sql = <<<SQL
INSERT INTO
products
(id, hash, name, description, large_img, small_img, label_img, category, small, large, small_price, large_price, best_seller, in_stock)
VALUES
($placeholders)
SQL;

<强> echo $sql

INSERT INTO
products
(id, hash, name, description, large_img, small_img, label_img, category, small, large, small_price, large_price, best_seller, in_stock)
VALUES
(?,?,?,?,?,?,?,?,?,?,?,?,?)