Perl 要灰显的行中多次出现字符串

Perl 要灰显的行中多次出现字符串,perl,Perl,我有两张支票 1:如果我有这样一行“水果:芒果香蕉”,我想捕获“芒果香蕉”部分并将其分配给另一个变量。现在我在关注这个, if(/$line == Fruits:\s(\w+)/){ myFav=$1; } 但它只返回“芒果”而不是“芒果香蕉”。有人能建议如何获得以空格分隔的完整水果列表吗 2:如果我在同一行中重复了一些字符串,我想捕获所有发生的事件 如果我有这样一句话:“我有水果:芒果,水果的颜色:香蕉是绿色的”。我想捕捉芒果和香蕉的价值观 if(/$line == Fruit:\s(\w+

我有两张支票

1:如果我有这样一行“水果:芒果香蕉”,我想捕获“芒果香蕉”部分并将其分配给另一个变量。现在我在关注这个,

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
    是一个好习惯
  • 使用绑定运算符(
    =~
    )而不是赋值运算符(
    =
    )将字符串与正则表达式再次匹配。并且输入字符串和绑定运算符位于匹配运算符之外

    /Fruit:\s([\w\s]+)/g
    
    如果($line=~/Fruits:\s(\w+/){


    • 一个解决方案是依赖于水果名称大写的事实

      然而,我倾向于使用两个正则表达式,一个用于水果,另一个用于水果

      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