Perl 要灰显的行中多次出现字符串
我有两张支票 1:如果我有这样一行“水果:芒果香蕉”,我想捕获“芒果香蕉”部分并将其分配给另一个变量。现在我在关注这个,Perl 要灰显的行中多次出现字符串,perl,Perl,我有两张支票 1:如果我有这样一行“水果:芒果香蕉”,我想捕获“芒果香蕉”部分并将其分配给另一个变量。现在我在关注这个, if(/$line == Fruits:\s(\w+)/){ myFav=$1; } 但它只返回“芒果”而不是“芒果香蕉”。有人能建议如何获得以空格分隔的完整水果列表吗 2:如果我在同一行中重复了一些字符串,我想捕获所有发生的事件 如果我有这样一句话:“我有水果:芒果,水果的颜色:香蕉是绿色的”。我想捕捉芒果和香蕉的价值观 if(/$line == Fruit:\s(\w+
if(/$line == Fruits:\s(\w+)/){
myFav=$1;
}
但它只返回“芒果”而不是“芒果香蕉”。有人能建议如何获得以空格分隔的完整水果列表吗
2:如果我在同一行中重复了一些字符串,我想捕获所有发生的事件
如果我有这样一句话:“我有水果:芒果,水果的颜色:香蕉是绿色的”。我想捕捉芒果和香蕉的价值观
if(/$line == Fruit:\s(\w+)/){
myFav=$1;
}
通常,上述代码在第一次出现“水果:”后停止搜索。有人能帮上忙吗
提前感谢:)改用这个:([\w\s]+)
而且总是:
use strict;
use warnings;
1/正则表达式只返回“Mango”的原因是\w+与“word”字符匹配。即数字、字母和下划线(即Perl符号名称中有效的字符)。如果要匹配两个水果名称之间的空格,则需要在正则表达式中添加一个空格(或者,更好的是,\s,它匹配所有空格)。你可能想把这两个原子放在一个角色类中
/Fruit:\s([\w\s]+)/
2/默认情况下,匹配运算符仅匹配输入字符串中第一个出现的正则表达式。为了匹配所有这些选项,您需要将/g
选项添加到匹配运算符
/Fruit:\s([\w\s]+)/g
您可能会发现其他一些有用的注释:
- 这是学习这些东西的好方法
- 这本书有所有血淋淋的细节
- 函数解释匹配运算符
- 在所有代码中添加
和use strict
是一个好习惯use warnings
- 使用绑定运算符(
)而不是赋值运算符(=~
)将字符串与正则表达式再次匹配。并且输入字符串和绑定运算符位于匹配运算符之外=
如果($line=~/Fruits:\s(\w+/){/Fruit:\s([\w\s]+)/g
- 一个解决方案是依赖于水果名称大写的事实
然而,我倾向于使用两个正则表达式,一个用于水果,另一个用于水果
use strict;
use warnings;
while (<DATA>) {
chomp;
while (/Fruits?: ((?:[A-Z]\w*\s*)+)(?<!\s)/g) {
print "Line $. - '$1'\n";
}
}
__DATA__
Fruits: Mango Banana
I have Fruit: Mango and the color of the Fruit: Banana is green
在您的第一篇帖子中,您使用了:
if ( /$line == Fruits:\s(\w+)/ ) {
首先,对于正则表达式,应该使用~=
而不是=
。其次,在正则表达式周围放置斜线,如下所示:
if ( $line ~= /Fruits:\s(\w+)/ ) {
现在,\w+
表示包含字母、数字、下划线的单词,仅此而已。它与空格不匹配
你有:
Fruits: Mango Banana
因此,\w+
将匹配Mango
,但将停止匹配Mango
之后的空格
如果要同时匹配这两个选项:
if ( $line =~ /^Fruits:\s+(.+)/ ) {
注意
将匹配包括空格在内的任何字符。插入符号表示至少匹配一个空格。星号匹配零个或多个空格。注意我也使用\s+
而不仅仅是\s
。这样,如果结果之后有多个空格,您将拥有一个匹配项
在第二个示例中,可以执行以下操作:
my @fruits = $line =~ /Fruits:\s+(\S+)/g
末尾的g
允许多个匹配项。否则,将只使用第一个匹配项。\S
表示所有包含可能的破折号的非空格。这将把您的匹配项放入数组@fruits
。阅读。这将帮助您更好地了解发生了什么
始终在程序中使用use strict;
和use warnings;
。这将帮助您捕获错误。您必须使用my
声明变量,但这是值得的。两篇文章最好解决两个问题。
if ( $line =~ /^Fruits:\s+(.+)/ ) {
my @fruits = $line =~ /Fruits:\s+(\S+)/g