繁体   English   中英

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

[英]Regular expression: word between spaces

对愚蠢的问题感到抱歉,但是有一个示例: 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语句,并排除[]任何表名和属性)

由于您没有用其他标点符号来分隔单词。 因此,我相信仅使用\\S就足够了。

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

在您的情况下,它不起作用,因为\\ s \\ w * \\ s正在吃掉输入中的SELECT (结尾处有空格),而CASE之前没有足够的空间( \\s )。

这是使用正则表达式匹配输入的方式:

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)

您可以使用此代码并将要跳过的所有部分放入捕获组:

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缩短了模式,但由于它无法代替数字,小写字母和下划线,因此可以将其替换为[AZ]

图案细节:

\[      # a literal [
[^\]]+  # character class with all characters except ] (repeated one or more times)
\]      # a literal ]

请注意,您无需转义右方括号(或仅适用于非常旧版本的Internet Explorer):),可以这样写: \\[[^]]+]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM