2016-09-25 10 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"; 
} 

問題は、文字列で検索して分割するオペレータが付属しています。 完全一致は、キーワードや他のテキストで動作しますが、事業者と =>=<=!=<<==>>++--ようにそれは働いていません。

1つずつ検索してテキストを分割する必要があります。

+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)