2011-12-08 37 views
0

文で完全停止(ピリオド)をどのように一致させることができますが、浮動小数点数または数字を含む単語と一致させたくありませんか?perlを使用して文中で完全一致を一致

例えば、

$sen = "I'm going to match full.stop in sentence 3.142"; 
if ($sen =~ (s/\.//)) { 
    print $1; 
} 

出力:この例では

fullstop 

私は言葉だけまたは英数字の言葉ではない数字と一致します。

+0

最初のピリオド(「full.stop」の途中のもの)を削除し、2番目のピリオド(3.142のもの)をそのまま残したいとしますか? –

答えて

3

使用して見て回る:

$sen =~ s/(?<!\d)\.(?!\d)//g; 

をこれは数字に続く数字はないが先行していない点に一致します。

OPさんのコメントによると、これは大文字が続いているドットを削除しますを更新:

#!/usr/bin/perl 
use Modern::Perl; 
use utf8; 

while(<DATA>) { 
    chomp; 
    s/\.(?=(?:\s*[A-Z])|$)//g; 
    # Or, if you want to be unicode compatible 
    s/\pP(?=(?:\s*\p{Lu})|$)//g; 
    say; 
} 

__DATA__ 
I'm going to match full.stop in sentence 3.142 
I'm going to match full.Stop in sentence 3.142 
I'm going to match full. Stop in sentence 3.142 
I'm going to match full.stop in sentence 3.142. End of string. 

出力:

I'm going to match full.stop in sentence 3.142 
I'm going to match fullStop in sentence 3.142 
I'm going to match full Stop in sentence 3.142 
I'm going to match full.stop in sentence 3.142 End of string 
+0

これは私がそれをあまりにも理解した方法でしたが、OPは「数字を含む言葉」にマッチさせたくないと言っていました。 – TLP

+0

@ M42 - ありがとう、大文字のあとに続く単語だけに一致させたいのですか? – aliocee

+0

@aliocee:私の更新を見てください。 – Toto

0

/(\.(\D|$))|\D\./を使用できます。 \Dは、非数字文字を意味し、あなたが最初の期間(「full.stop」の真ん中に1)を削除したい場合は$はライン

0

の終わりを意味するが、第二1(3.142中1)のままに無傷で、また「1」のような数字にしておきます。または「p.1223」あなたは、次の操作を行うことができます。

$sen =~ s/(\D)\.(\D)/$1$2/g; 
print $sen; 
+1

Oof。もちろんあなたは正しい。他のケースをテストした後、ブラケットを外すのを忘れてしまった。答えを編集しました。ありがとう! –

0

それはあなたのような単純なREG-EXEファイルを保つためにうれしいです彼らはすでに読むのが難しいからです。

$sen = "I'm going to match full.stop in sentence 3.142"; 
print "$1\n" if $sen =~ /([^\d\s]+\.[^\d\s]+)/'; 

が与える:

full.stop

一つ以上のない桁アンド空白次いで'.'、再度一つ以上のない桁アンドない空白を照合します

+0

出力を追加すると、明確かつ完全な答えになります。あなた自身が言うように、正規表現は読むのが簡単ではないので、正規表現はそれほど役に立たないだけであれば、あまり役に立ちません – Vince

関連する問題