正则表达式:空格之间的单词

时间:2014-03-08 11:17:31

标签: javascript regex

讽刺愚蠢的问题,但有一个例子: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语句并排除[]中的所有表名和属性)

2 个答案:

答案 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):),您可以写:\[[^]]+]