我对正则表达式相当新,我在字符串中计算(只有前导)空格时遇到了一些问题。
让我们说我有一个看起来像这样的字符串:
my $str=" for getopts :h opt;; do #this is just a comment";
现在我只想计算此字符串中的前导空格/制表符。没有改变原始字符串 - 只是计数。
我尝试过这样的事情(我知道这非常简单):
my $count =()= $str =~ /"^[\\t]|^\\s+"/gm;
但不幸的是,这当然只是这个字符串中的第一个空格 有人有个主意吗?
答案 0 :(得分:4)
目前尚不清楚你的字符串是否
'my $str=" for getopts :h opt;; do #this is just a comment";'
或只是
' for getopts :h opt;; do #this is just a comment'
但我假设后者。但是,该字符串中没有任何双引号,因此您的正则表达式将失败,因为它需要它们。
我无法让你的陈述做任何有用的事情。您是否意识到正则表达式中的\\s
和\\t
表示字面字符反斜杠\
和s
或t
,而不是空格和制表符的元字符?
您可能不理解的另一种方式是
my $count = () = $str =~ /\G\s/g;
通过将全局匹配放在列表上下文中,以便逐个找到所有前导空格,然后将该列表放在标量上下文中以返回其长度。
然而,最简单和最明显的方法是捕获字符串开头的所有空格,并测量其长度,如下所示
use strict;
use warnings;
use 5.010;
my $str = " for getopts :h opt;; do #this is just a comment";
$str =~ /^(\s*)/;
my $count = length($1);
say $count;
<强>输出强>
8
答案 1 :(得分:1)
您可以使用以下代码查找$str
if ($str =~ m/^(\s+)/) {
$count = length $1;
}