Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式精确空间匹配_Regex_Perl - Fatal编程技术网

Regex 正则表达式精确空间匹配

Regex 正则表达式精确空间匹配,regex,perl,Regex,Perl,我试图找到合适的正则表达式来匹配确切的空格数。输入文本可以包含任何其他文字 例如,如果我想要2个空格,则图案应匹配: " AX " " AX" "AX BX CX" 以及其他两个空格的组合。我现在的正则表达式是: "^(([^[:space:]]*\\s[^[:space:]]*){2})$" 然而,正则表达式总是发现两种模式。如果输入“AX BX CX”,则会找到“AX BX CX”和“CX” 出于测试目的,我使用简单的perl脚本: #!/usr/bin/perl if ($#ARG

我试图找到合适的正则表达式来匹配确切的空格数。输入文本可以包含任何其他文字

例如,如果我想要2个空格,则图案应匹配:

" AX "
"  AX"
"AX BX CX"
以及其他两个空格的组合。我现在的正则表达式是:

"^(([^[:space:]]*\\s[^[:space:]]*){2})$"
然而,正则表达式总是发现两种模式。如果输入“AX BX CX”,则会找到“AX BX CX”和“CX”

出于测试目的,我使用简单的perl脚本:

#!/usr/bin/perl

if ($#ARGV + 1 != 2) {
    print "Usage: match.pl pattern input\n";
    exit;
}

$pattern = $ARGV[0];
$input = $ARGV[1];

if ($input =~ /$pattern/) {
    print "Matched: $1  - $2 \n";
} else {
    print "Not matched.\n";
}

您要查找的正则表达式是
[^]*[^]\+[^]*
。只有在查找两个以上的空格时,才应使用
{}
。例如,将匹配三个空格:
[^]*\([^]\+\)\{2\}[^]*

使用以下方法进行测试:

grep '[^ ]*\( [^ ]\+\)\{2\} [^ ]*'

如果允许使用两个连续的空格,则可以使用:

grep '\([^ ]* \)\{2\}'
增加
2
以获得更多空间

在你的情况下,我会尝试:

([^[:space:]]*[:space:]){2}
若要匹配两个空格,请在直线上精确设置两个空格

^([^[:space:]]*[:space:]){2}[^[:space:]]*$
我们用潜在的非空格字符填充双空格

现在,要捕捉整条线,请将其分组:

(^([^[:space:]]*[:space:]){2}[^[:space:]]*$)
剩下的就是忽略中间组,我们在组的开头添加
?:
。使成为最终正则表达式

(^(?:[^[:space:]]*[:space:]){2}[^[:space:]]*$)

这很有效。字符串中只有两个空格。
它使用了臭名昭著的未滚动循环方法

 # ^[^ ]*(?:[ ][^ ]*){2}$

 ^ 
 [^ ]* 
 (?:
      [ ] 
      [^ ]* 
 ){2}
 $

使用匹配样式的正则表达式执行此操作很棘手。我可能会根据以下代码推荐更多内容:

my (@fields) = split( /\s/, $input );
if( scalar( @fields ) < 3 ) {
    warn "'$input' didn't have enough spaces!";
elsif( scalar( @fields ) > 3 ) {
    warn "'$input' had too many spaces!";
}
my(@fields)=拆分(/\s/,$input);
if(标量(@字段)<3){
警告“$input”没有足够的空间!”;
elsif(标量(@fields)>3){
警告“$input”的空格太多!”;
}

split
如果以这种方式使用,将采用类似于
'C'
的字符串并将其拆分为
('''','C')

在Perl中,扩展名最好从
[^[:space:]
写入
[[:^space:]
在这种情况下最好不要使用Posix。您可以将其中一个因素去掉,因为它们是冗余的。^
[^[^:[^]空格:]*([^[:space:]*
…是的,很明显,我是怎么错过的。我想我的方法有点太有建设性了。谢谢你指出这一点!!不幸的是结果是一样的。如果我使用最后一个正则表达式并输入“AX BX CX”,结果将是“BX”。我可能需要将整个正则表达式放在括号中,但随后我将再次收到两个结果。一个结果应为“AX BX CX”,但第二个结果仅为“BX”。哦,然后使用
(^(?:[^[^[:space:]]*[:space:]*[:space:]){2}[^[:space:]*$)
,正如sln所建议的那样。如果
?:
是组的前两个字符,则无法捕获。
my (@fields) = split( /\s/, $input );
if( scalar( @fields ) < 3 ) {
    warn "'$input' didn't have enough spaces!";
elsif( scalar( @fields ) > 3 ) {
    warn "'$input' had too many spaces!";
}