正则表达式匹配并捕获单词

时间:2017-10-27 20:22:09

标签: regex perl

我在perl脚本中编写了一个正则表达式,用于查找和捕获包含句子中"fp""fd""sp""sd"的单词的单词。但是,该单词可能包含一些非单词字符,如θ或ð。这个词可能在句子的开头或结尾。当我在regex101.com上测试这个正则表达式时,即使输入是空的,它也匹配。我解释这个正则表达式的方式是:匹配模式“fp”,“fd”,“sp”或“sd”之一和捕获它周围的所有内容,直到左侧的空白或行的开头以及右侧的行的空白或末尾。

这是正则表达式:^|\s(.*[fs][ˈ|ˌ]?[pd].*)\s|$

我还尝试使用?量词使.*模式变得懒惰,但它仍然显示当输入什么都没有时匹配。

以下是我需要在括号中捕获的一些示例:

(fpgθ) tig <br/>
tig (gfpθ) tig<br/>
tig (gθfp)<br/>
编辑:我忘了解释中间部分。 [ˈˌ]?部分(我犯了一个错误,我不需要|)只允许这些字符位于[fs][pd]之间。我不希望它匹配像tigf pg这样的东西。我想让它匹配任何单词(由它周围的空间定义 - 所以在像tig you rθð这样的句子中,它包含的单词是tigyourθð)。这个“单词”可以在句子的结尾,开头或中间。有没有办法在括号内的字符串开头断言位置?我想这可以解决我的问题。

此外,我尝试使用\w,但因为我有θð之类的内容,所以与127.0.0.1:4000example.loc/api/api.php?querystuff不匹配。

2 个答案:

答案 0 :(得分:1)

  

查找并捕获包含序列“fp”,“fd”,“sp”或的序列   “sd”在一个句子里。但是,这个词可能包含一些非单词   字符如θ或ð。

您应该匹配Unicode字母\p{L}而不是常规字词\w

\p{L}*[fs][pd]\p{L}*

点击图案在线试用。我根据您最新的编辑简化了模式。

use warnings;
use strict;

use utf8;
use open ":std", ":encoding(UTF-8)";

my @regex = qr/\p{L}*[fs][pd]\p{L}*/mp;
my @strs = 'fpgθ tig <br/>
tig gfpθ tig<br/>
tig gθfp<br/>
fptig gfpθ tig<br/>
sddgsdθ(θ@) tig gθfp<br/>';

for (@strs) 
{
    my @m = /@regex/gm;
    print "@m" if @m;   # no space allowed by the pattern
}

答案 1 :(得分:1)

描述中仍有一点开放性,但这适用于显示的数据

use warnings;
use strict;
use feature 'say';

use utf8;
use open ":std", ":encoding(UTF-8)";

my @strs = ( 
    '(fpgθ) tig <br/>',
    'tig (gfpθ) tig<br/>',
    'tig (gθfp)<br/>',
);

for (@strs) 
{
    my @m = /\b( \S*? [fs][pd] \S*? )\b/gx; 

    say "@m" if @m;   # no space allowed by the pattern
}

根据说明的不同,您可能需要调整使用的\S\b。对于具有多个匹配项的字符串,我使用/g捕获到数组中。我留下了括号进行额外的测试。

use utf8允许源代码中使用UTF-8,因此仅适用于我的@strs数组。

然而,use open pragma是必不可少的,因为它设置了默认(PerlIO)输入和输出层,在本例中为UTF-8的标准流。因此,您可以从文件中读取并打印到文件或控制台。