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

3

抱歉,我有一个愚蠢的问题,但是这里有一个例子: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);

我有一个字符串,想要将每个单词转换为小写字母,这些单词之间由空格分隔(可以在行首和行尾)。
但是,我的结果是: select CASE when STATE in 这就是我的问题所在。为什么会这样呢?
编辑:我希望输入SELECT * FROM [Users] u,并得到select * from [Users] u等结果(包括每个SQL语句,但排除[]中的任何表名和属性)。

我不明白。你期望的输出是什么? - Mitya
使用前瞻和后顾匹配空格。 - Krzysztof Jabłoński
1
@KrzysztofJabłoński:JavaScript 没有后顾之忧的功能。 - Casimir et Hippolyte
@CasimiretHippolyte 是的,你说得对。但在这种情况下,使用单个前瞻就可以解决问题:(^|\s)\w*(?=\s|$)。最后一个空格不会被正则表达式消耗掉,因此它可能被作为另一个匹配的开头而被消耗掉,从而匹配所有带有空格的单词。 - Krzysztof Jabłoński
2个回答

3

因为你没有使用其他标点符号将单词分开,所以我认为只需要使用\S就足够了。

q = q.replace(/(\S+)/g, function(match)

在您的情况下,它无法正常工作是因为 \s\w*\s 吞掉了输入中的 SELECT(带有结尾空格),并且 CASE 前面没有足够的空格(\s)。
以下是使用正则表达式匹配您的输入的方法:
SELECT CASE WHEN state IN 
^  m1 ^    ^ m2 ^     ^m3^

它只忽略了正则表达式中的大小写和状态单词。因为在SELECT之前选择了CASE前的空格。你必须在单词两侧都有强制性空格(\s\w*\s)。换句话说,你的正则表达式有重叠。

更新后的正则表达式:

q = q.replace(/(?:\s|^)(\w+)(?=\s|$)/g, function(match)

你说的“eating”是什么意思?如果是指子字符串,那么case应该从$-start line character开始。如果不是,那么空格仍然在字符串中。 - Maxim Zhukov
@FSou1 我已经更新了我的答案。希望这个例子能帮助你更好地理解输入和正则表达式的重叠部分。 - Sabuj Hassan

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

一个花哨的东西。它在逻辑中引入了一个分支,虽然它可能是一个合适且可行的解决方案,但是它相当难以阅读和理解。 - Krzysztof Jabłoński
@KrzysztofJabłoński:“难以阅读”,我不明白,我会添加模式的第一部分的简短描述。这种方法的优点是您可以轻松地将其定制为跳过引号之间的字符串或任何您想要的内容。 - Casimir et Hippolyte
这并不是什么大问题,但我花了5分钟才理解你的两行代码片段。而对于提问者的代码片段,我只用了20秒就明白了。 - Krzysztof Jabłoński
@KrzysztofJabłoński:别担心,下一次只需要不到一秒钟。 - Casimir et Hippolyte

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接