使用Perl中的运算符匹配和拆分的正则表达式

时间:2016-09-25 10:13:52

标签: regex perl

我需要一个匹配完全关键字以及特殊字符或运算符的正则表达式。

例如,我有一个字符串,我想用正则表达式拆分它。

 my $data="long i = sbyte.MinValue ; i => sbyte.MaxValue ; > i++";

如果我在等号=上拆分它,那么它应该返回两个字符串:

  1. long i

  2. sbyte.MinValue ; i => sbyte.MaxValue ; > i++

  3. 如果我与=>分开,那么它将返回:

    1. long i = sbyte.MinValue ; i

    2. sbyte.MaxValue ; > i++

    3. 以下是示例代码:

      my $key = "=";
      
      my $data = "long i = sbyte.MinValue ; i => sbyte.MaxValue ; > i++";
      
      #=~/\b$s\b/
      #/\b$key\b/
      
      my @matches = ( $data =~/\b$key\b/ );
      
      my @string = split (/\b$key\b/, $data); # split ~ /^=$/, $data;
      
      if ( scalar(@string) > 0 ) {
      
          foreach my $item ( @string ) {
              print "$item \n";
          }
      }
      else {
          print "Nothing found \n";
      }
      

      问题在于运营商要搜索并拆分字符串。 完全匹配与关键字或其他文本一起使用,但与运算符匹配 比如=>=<=!=<<==>>++--它不是工作

      我需要逐个搜索并拆分文本。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用tokenizer来处理为您解析字符串,以免重新发明轮子。以下是使用PPI::Tokenizer

的示例
#!/usr/bin/env perl

use strict;
use warnings;

use List::MoreUtils qw( any );
use PPI::Tokenizer;

my @operators_i_care_about = qw( = => >= <= != <<= =>> ++ -- );

my $data = "long i = sbyte.MinValue ; i => sbyte.MaxValue ; > i++";

my $tokenizer = PPI::Tokenizer->new( \$data );

for my $token ( @{ $tokenizer->all_tokens } ) {
    if ( 'PPI::Token::Operator' eq ref $token
         and any { $_ eq $token->content } @operators_i_care_about ) {
         print "\nOPERATOR: $token\n";
    } else {
        print $token; # Stringifies
    }
}

<强>输出

long i
OPERATOR: =
 sbyte.MinValue ; i
OPERATOR: =>
 sbyte.MaxValue ; > i
OPERATOR: ++

答案 1 :(得分:0)

我仍然对你要做的事情非常朦胧,但我在你的代码中看到的直接问题是你的正则表达式为\b=\b而等号是=出现在目标字符串中,前面只有空格,后跟空格或大于号>

零宽度模式\b匹配单词字符和非单词字符之间的位置或字符串的开头或结尾

单词字符仅包括大写和小写字母,十进制数字和下划线_,因此等于,空格和大于所有非单词字符,并且您的正则表达式模式在字符串中无处匹配

您可能认为等号被空格字符包围,您可以使用\s=\s执行此操作,或者您希望字符串的开头和结尾与它们的工作方式相同对于\b,您可以使用(?<!\S)=(?!\S)

使用负面外观