我在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θð
这样的句子中,它包含的单词是tig
,you
和rθð
)。这个“单词”可以在句子的结尾,开头或中间。有没有办法在括号内的字符串开头断言位置?我想这可以解决我的问题。 此外,我尝试使用\w
,但因为我有θ
或ð
之类的内容,所以与127.0.0.1:4000
或example.loc/api/api.php?querystuff
不匹配。
答案 0 :(得分:1)
查找并捕获包含序列“fp”,“fd”,“sp”或的序列 “sd”在一个句子里。但是,这个词可能包含一些非单词 字符如θ或ð。
您应该匹配Unicode字母\p{L}
而不是常规字词\w
:
点击图案在线试用。我根据您最新的编辑简化了模式。
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
的标准流。因此,您可以从文件中读取并打印到文件或控制台。