2016-07-16 6 views
1

特定のハイフンの単語をハイフンを削除しますが無視例えば: -Perlの正規表現は、私がスペースにハイフンを変換するperlの正規表現を持っている

$string =~ s/-/ /g; 

は、私は特定のハイフネーションされたフレーズを無視するように、これを変更し、例えば、ハイフンを置き換えないようにする必要がありますこのような文字列で:

私はDVI-DとDVI-iは、それが読み込んでハイフンを交換しないことを望む
"use-either-dvi-d-or-dvi-i" 

:私は、様々な負の先見の一致を試みたが、無残に失敗している

"use either dvi-d or dvi-i" 

+1

何を試しましたか? 'dvi-i'と' dvi-d'はあなたが除外したい唯一のフレーズですか?または、それらの「ホワイトリスト」がありますか? –

+0

実際には白いリストが良いかもしれません。残っているかもしれない言葉が残っているかもしれません。 –

答えて

4

あなたの試合から特定の単語をスキップする動詞(*SKIP)(*F)このPCRE正規表現を使用することができます。これが原因(*SKIP)(*F)の使用に言葉に分割のためdvi-idvi-dをスキップします

dvi-[id](*SKIP)(*F)|- 

RegEx Demo

。それがある場合は基本的に一致するハイフンを意味

/(?<!dvi)-|-(?![di])/ 

$string =~ s/dvi-[id](*SKIP)(*F)|-/ /g; 

Perl Code Demo


がベース代替前後参照だけでなくソリューションがあります:あなたのコードの場合

先行しないまたは、をLHSに、[di]をRHSに設定した場合、dまたはiがない場合は、-と一致しないことを確認してください。

Perlコード:

$string =~ s/(?<!dvi)-|-(?![di])/ /g; 

Perl Code Demo 2

+1

あなたのregexのデモ出力(** '' dvi-dまたは-dvi-i **のどちらかを使用してください) 。 – Arijit

+0

良い点@Arijit、今修正されました – anubhava

+0

私は(* SKIP)をperlで使うことはできませんが、それは好きではありませんか? –

1
$string =~ s/(?<!dvi)-(?![id])|(?<=dvi)-(?![id])|(?<!dvi)-(?=[id])/ /g; 

だけ(?<!dvi)-(?![id])を使用している間、あなたはまた、xは任意の文字することができdvi-xまたはx-iを除外します。

+1

これはなんですか?なぜあなたは交代を使用していますか? – rock321987

+0

私は説明を加えました。 – horcrux

+0

私はOPが 'dvi'と' x'の間で '-'を除外してうれしいと思っています。 – rock321987

-2

我々は負の先読みを使用して特定の単語負のルックビハインド

例無視することができます:あなたのケースで

(?!pattern) 
is a negative look-ahead assertion 

パターンが

$string =~ s/(?<!dvi)-(?<![id])/ /g; 

出力です:

use either dvi-d or dvi-i 

参考:http://www.perlmonks.org/?node_id=518444

が、これはあなたを助けることを願っています。

+0

'dvi-abc'で分割されません。 – anubhava

+0

' \ + 'を追加するとあなたの懸念が解決します。ユーザーの例の前のパターンのみ。 – Arijit

+0

'\ w'の後に' \ + 'をリセラル' + 'にマッチさせてエスケープします – anubhava

0

シンプルで簡単な正規表現の解決策を得ることはできません。

#!/usr/bin/env perl 

use strict; 
use warnings; 

my %whitelist = map { $_ => 1 } qw(dvi-d dvi-i); 

my $string = 'use-either-dvi-d-or-dvi-i'; 

while ($string =~ m{ ([^-]+) (-) ([^-]+) }gx) { 
    my $segment = substr($string, $-[0], $+[0] - $-[0]); 
    unless ($whitelist{ $segment }) { 
     substr($string, $-[2], 1, ' '); 
    } 
    pos($string) = $-[ 3 ]; 
} 

print $string, "\n"; 

@-配列が一致したグループの開始オフセットを含み、@+配列は終了オフセットが含まれています。ただし、次のことを試みることができます。どちらの場合も、要素0は完全一致を指します。

私はこのbecause of how \G worksような何かに頼らなければならなかった:s///がすでに交換されている置換の一部を上書きすることを拒否することを

も注意してください。したがって、たとえば、これはむしろ、文字列を逆方向にその方法を反復するよりも、最初の反復の後に停止します。

$_ = "123456789"; 
    pos = 6; 
    s/.(?=.\G)/X/g; 
    print;  # prints 1234X6789, not XXXXX6789 

たぶん@tchristが彼の意志に様々なアサーションを曲げる方法を見つけ出すことができます。