讽刺愚蠢的问题,但有一个例子:http://jsfiddle.net/rb98M/
var q = 'SELECT CASE WHEN STATE IN ';
q = q.replace(/(^|\s)\w*(\s|$)/g, function(match) { return match.toLowerCase(); });
alert(q);
我有一个字符串,我想在每个单词之间创建lowerCase,这是在空格之间(并且可以在行开头和结尾处)。
但是,我的结果是:
select CASE when STATE in
这就是我的问题。为什么会这样?
编辑我希望传递SELECT * FROM [Users] u
并获取select * from [Users] u
等等(包括每个SQL语句并排除[]
中的所有表名和属性)
答案 0 :(得分:3)
因为你没有将这些单词与其他标点分开。所以我相信只使用\S
就足够了。
q = q.replace(/(\S+)/g, function(match)
在你的情况下它没有用,因为\ s \ w * \ s正在从输入中吃SELECT
(末尾有空格),而CASE
没有足够的空间( \s
)之前。{/ p>
以下是使用正则表达式匹配输入的方式:
SELECT CASE WHEN state IN
^ m1 ^ ^ m2 ^ ^m3^
它只是忽略了CASE
广告来自正则表达式的state
个字词。因为CASE
之前的空格被SELECT
选中了。您在单词的两边都有必填空格(\s
)(即\s\w*\s
)。换句话说,你的正则表达式有重叠。
q = q.replace(/(?:\s|^)(\w+)(?=\s|$)/g, function(match)
答案 1 :(得分:1)
您可以使用此代码并将要跳过的所有部分放入捕获组中:
var q = 'SELECT * FROM [Users] u aNd GeT sElEct * from [Users] U';
q = q.replace(/(\[[^\]]+\])|\w+/g, function(m, g1) {
return (g1) ? m : m.toLowerCase(); });
仅当定义了捕获组时,方法toLowerCase()
才会应用于整个匹配。
我使用\w
缩短了模式,但由于替换数字,小写字母和下划线无用,您可以将其替换为[A-Z]
模式细节:
\[ # a literal [
[^\]]+ # character class with all characters except ] (repeated one or more times)
\] # a literal ]
请注意,您不需要转出结束方括号(或仅适用于非常旧版本的Internet Explorer):),您可以写:\[[^]]+]