正则表达式确切的空格匹配

时间:2015-05-26 23:20:47

标签: regex perl

我正在尝试找到与正确的空格数匹配的正确正则表达式。输入文本可以包含任何其他文字。

如果我想要2个空格,例如模式应匹配:

$destroy

以及具有两个空格的任何其他组合。我目前的正则表达式是:

" AX "
"  AX"
"AX BX CX"

然而,正则表达式总是找到两种模式。如果是“AX BX CX”输入,它将找到“AX BX CX”和“CX”。

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

"^(([^[:space:]]*\\s[^[:space:]]*){2})$"

3 个答案:

答案 0 :(得分:1)

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

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!";
}

split,如果以这种方式使用,则会使用' C'之类的字符串并将其划分为( '', '', 'C' )

答案 1 :(得分:0)

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

使用以下方式测试:

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

grep '[^ ]* [^ ]\+ [^ ]*'

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

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

增加2以获得更多空格。

在你的情况下,我试试:

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

匹配两个空格,如果你想要两行空格。

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

我们用可能的非空格字符填充双空格。

现在要抓住整行,将其放在一个组中:

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

剩下的就是忽略中间组,我们通过在组的开头添加?:来实现。 最终正则表达式

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

答案 2 :(得分:0)

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

GetProcAddress