2011-07-29 141 views
7

我可以使用javascript正则表达式来计算字符串中第一个文本字符之前的空白字符数量吗?我只在乎是否有0,1和2+。JavaScript正则表达式来计算空白字符

我目前的工作解决方案是有三个正则表达式,只是使用匹配来确定0,1或2+类别(每个单独的模式),但我寻找一个更优雅的解决方案。

它甚至有可能使用正则表达式来计算模式吗?我可以使用非贪婪分组和计数我猜的长度....

+0

2+是指两个还是更多?是否有意为每种类型的字符串生成计数? –

回答

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

此正则表达式0和2之间的空白字符在字符串开始处匹配。

+1

为什么不''theString.match(/^\ s + /)[0] .length' - OP意味着,我认为2+意味着两个或更多,尽管它是奇怪的措辞。 –

+0

@射线:这听起来像只有三个类别。 – SLaks

+0

正确,只有三个类别:0,1或2+。我还需要获得领先的空白之后的所有内容,例如java trim。 – hvgotcodes

4

你可以这样做:

" aaa".replace(/^(\s*).*$/,"$1").length 
+1

当初始空格为零时似乎不起作用 - 它返回整个单词的长度。 – jfriend00

+0

谢谢,我将+改为* – Enki

2

我不知道我会在现实生活中使用正则表达式这项工作,但你可以匹配他们在捕获和看到他们的长度:

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

+0

空字符串的'/ ^(\ s *)[^ \ t] /'返回null,这意味着您无法在没有某种检查的情况下直接使用它匹配[1] .length'。我并不是说我的方法是最紧凑的,但我试图为所有边缘案例安全。 – jfriend00

+1

啊,我看到了 - 但我认为它返回null,因为它找不到'[\ t]'位。由于正则表达式无论如何都是贪婪的,你可以单独使用'^(\ s *)'。 – paxdiablo

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或者其他,并且作用于字符串的其余部分。

您应该将正则表达式视为工具它们并不是整个工具箱中的

1

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

t.search(/\S/); 

如果你坚持,你可以限制与Math.min(t.search(/\S/), 2);

返回0,1或2如果没有非空格字符的回报将是-1 ....