匹配多个空格之间的字符串

时间:2014-07-28 10:34:29

标签: regex string perl

Hello,任何人都可以帮我使用正则表达式来匹配多个空格之间的字符串

我的字符串可能如下所示:

This is just          Nicolas-764 sdh            and   his sister

我想匹配Nicolas-764 sdh

到目前为止,我写了这个,但它匹配第一个空格后的所有字符串

if ($string =~ m/(just) {5,}(.*) {5,}/) {
          print "$1\n";
          print "$2\n";
}

我想创建一个具有键just和值Nicolas-764 sdh的哈希值。 我不想只在多个空格之间匹配一个字符串。我也需要使用just

2 个答案:

答案 0 :(得分:1)

你患有贪婪的匹配.*

您只需使用.*?更改为非贪婪匹配。

use strict;
use warnings;

my $string = 'This is just          Nicolas-764 sdh            and   his sister';

if ($string =~ m/just\s{5,}(.*?)\s{5,}/) {
     print "$1\n";
}

输出:

Nicolas-764 sdh

答案 1 :(得分:0)

您的代码将是,

if ($string =~ m/^.*?just {5,}(\S+)\s+(\S+) {5,}.*$/) {
          print "$1\n";
          print "$2\n";
}

第一组包含Nicolas-764,第二组包含sdh

DEMO

或者

你也可以试试下面的正则表达式,

^.*?just {5,}(\S+(?:\s\S+)*?) {5,}.*$

<强>解释

  • ^首先,我们处于行首。
  • .*?just这将匹配第一个just字符串。在?进行非贪婪的匹配后*
  • {5,}匹配5个或更多空格。
  • ()捕捉群组。
  • \S+一个或多个非空格字符。
  • (?:)非捕获组。它不会捕获任何东西。只需匹配即可。
  • (?:\s\S+)*?匹配一个空格,后跟一个或多个非空格字符。整个过程会发生零次或多次。
  • {5,}匹配5个或更多空格。
  • .*匹配任何字符零次或多次。
  • $断言我们在行尾。