【问题标题】:Match a string between multiple whitespaces匹配多个空格之间的字符串
【发布时间】:2014-07-29 14:31:38
【问题描述】:

你好,谁能帮我用正则表达式来匹配多个空格之间的字符串

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

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

【问题讨论】:

  • and也在多个空格之间

标签: regex string perl


【解决方案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

【讨论】:

    【解决方案2】:

    你的代码是,

    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 个或更多空格。
    • .* 匹配任意字符零次或多次。
    • $ 断言我们在行尾。

    【讨论】:

    • 我已经更新了这个问题。我想明确一点,在第二组中我可以有多个单词,它们之间用空格分隔。我知道小组何时结束,当我发现不止一个空格时。
    • 那行得通,但没有办法一次匹配所有内容吗?为什么使用 2 个组?
    • 好的,我会尽快接受这个答案,大约 5 分钟。在那之前你能解释一下那个正则表达式中发生了什么。我不明白: 的含义,为什么最后用那个$
    猜你喜欢
    • 2015-07-22
    • 2023-02-24
    • 2013-12-28
    • 1970-01-01
    • 2017-10-25
    • 2015-12-25
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    相关资源
    最近更新 更多