JavaScript 正则表达式:计算空格字符数量

9
我能使用JavaScript正则表达式来计算字符串中第一个文本字符前的空格字符数量吗?我只关心有0个、1个和2个以上的情况。目前我的工作解决方案是使用三个正则表达式,并使用match确定0、1或2+类别(每个模式单独匹配),但我正在寻找更优雅的解决方案。是否可能使用正则表达式计算模式的数量?我可以使用非贪婪分组并计算长度,我猜....

2+ 是指两个还是更多?您的意图是为每种字符串都生成一个计数吗? - Ray Toal
6个回答

8
"     a".match(/^\s{0,2}/)[0].length

这个正则表达式匹配字符串开头的0到2个空白字符。


2
为什么不使用theString.match(/^\s+/)[0].length呢?根据我理解,OP的意思是2+表示两个或更多,尽管措辞有些奇怪。 - Ray Toal
@Ray:听起来好像只有三个类别。 - SLaks
只需要三个类别:0、1或2+。同时需要获取前导空格后的所有内容,就像Java中的trim函数一样。 - hvgotcodes
将Java中的字符串修剪为 str.replace(/^\s*(.*?)\s*$/,"$1") - Enki
@SLaks 对不起,我的意思是 \s*。好答案!! - Ray Toal

4
你只需要这样做:
"   aaa".replace(/^(\s*).*$/,"$1").length

1
当初始空格为零时,似乎无法正常工作 - 它会返回整个单词的长度。 - jfriend00

3
我不确定在实际工作中是否会使用正则表达式来完成这项任务,但是可以通过捕获匹配它们并查看其长度来实现:

function countLeadingSpaces(str) {
    return(str.match(/^(\s*)/)[1].length;
}

一种非正则表达式的方式,专门为提高速度而设计(与正则表达式相比,几乎任何东西都更快):
function countLeadingSpaces2(str) {
    for (var i = 0; i < str.length; i++) {
        if (str[i] != " " && str[i] != "\t") {
            return(i);
        }
    }
    return(str.length);
}

1
为什么不使用\s*,从而完全摆脱“匹配”检查呢? - paxdiablo
对于空字符串的 /^(\s*)[^ \t]/ 匹配结果返回 null,这意味着你不能直接引用 [1].length 来获取匹配结果,需要进行某种检查。我并不是在建议我的方法最紧凑,但我试图为所有边缘情况提供安全保障。 - jfriend00
1
啊,我明白了 - 但我认为它返回 null 是因为找不到 [ \t] 部分。由于正则表达式本来就是贪婪的,所以你可以只使用 ^(\s*) - paxdiablo
好的,我更新了答案。这最终得到了类似于其他人的东西。 - jfriend00
但是它简洁且可重复使用,因此加1分 :-) - paxdiablo

2

您可以在字符串中找到第一个非空格字符的索引,这与前导空白字符的数量相同。

t.search(/\S/);

如果您坚持,可以使用 Math.min(t.search(/\S/), 2); 来将返回限制为0、1或2。

如果没有非空格字符,则返回值为-1....


0
为什么不直接使用捕获组并检查长度呢?
<html>
    <head>
    </head>
    <body>
        <script language="javascript">
            var myStr = "  hello";
            var myRe = /^(\s*)(.*)$/;
            var match = myRe.exec(myStr);
            alert(match[1].length);  // gives 2
            alert(match[2]);         // gives "hello"
        </script>
    </body>
</html

接下来可以跟着处理你的三种情况的代码,长度为0、1或其他,并对字符串的其余部分进行操作。

你应该将正则表达式视为它们所代表的工具,而不是整个工具箱。


0

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