2016-09-25 15 views
0

我需要一個匹配確切關鍵字以及特殊字符或運算符的正則表達式。在Perl中與運算符匹配並拆分的正則表達式

例如,我有一個字符串,我想用正則表達式來分割它。

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

如果我分裂這個上等號字符=那麼它應該返回兩個字符串:

  1. long i

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

如果我=>分裂然後它會重新轉:

  1. long i = sbyte.MinValue ; i

  2. sbyte.MaxValue ; > i++

下面是示例代碼:

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"; 
} 

問題帶有一個操作符來搜索和分裂的字符串。 完全匹配的作品與關鍵字或其他文本,但與運營商 像=>=<=!=<<==>>++--它不工作。

我需要逐個搜索並分割文本。

+0

這應該有C#標記嗎? – Calum

+0

是的任何標籤,但正則表達式的問題是不能與operatior一起使用。 – Gaurav

+3

你在找什麼結果? – xxfelixxx

回答

0

您可以嘗試使用標記器來處理爲您解析字符串,以免重新發明輪子。下面是使用一個例子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: ++ 
+0

謝謝,這是我正在尋找的。 – Gaurav

0

我還是你正在試圖做什麼很朦朧,但眼前的問題,我可以看到你的代碼是您有\b=\b的正則表達式模式,而等號=出現在您的目標字符串中,前面只有一個空格,後面跟着空格或大於號>

零寬度模式\b匹配單詞字符和非單詞字符或字符串的開頭或末尾之間的位置

單詞字符只包括大寫和小寫字母,十進制數字和下劃線_ ,所以等於,空間和更大 - 比所有非單詞字符,並且您的正則表達式模式與字符串中的任何地方匹配

您可能意味着等號被空格字符包圍,並且您可以\s=\s,或者如果您希望字符串的開始和結尾以與\b相同的方式工作,那麼您可以使用反向查找與(?<!\S)=(?!\S)