2012-03-17 10 views
-2

左端のシンボルと右端のシンボルが同じになるように文字列を一致させようとしています。それ、どうやったら出来るの?perlの右端と左端のシンボルと正規表現の一致

+0

あなたの許容可能な記号に置き換えてください。 – tchrist

+0

@tchrist、任意の英数字。私は正式な答えがほしいと思った。私は表現を自分で作ることができます。 – gzg

+2

シンボルは '\ pS'です。文字は '\ pL'です。数字は '\ pN'です。アルファベットは '\ p {alpha}'であり、さまざまな記号や記号が含まれており、特定の数字は除外されています。私はあなたに正式な答えを与えました。 – tchrist

答えて

1
$string =~ m/^(.).*\1$/ 

が有効です。しかし、これは長さ1の文字列と一致しません。

+0

私は(。)は最初のシンボルをグループ化し、\ 1は最初のグループを表すと考えます。私は正しい? – gzg

+1

はい。私はちょうどあなたのためのいくつかの詳細と私の答えへのリンクを追加しました。 –

+0

私は恐怖です@gzgはより多くの規定を追加していますので、あなたのパターンはもはや彼が求めたものを満たしていません。 – tchrist

2

それはあなたが「シンボル」と考えるものの明確化せずに意味内容を正確に把握することは不可能だが、ここでは一つの可能​​な解決策は以下のとおりです。

use Unicode::Normalize; 
NFD($string) =~/\A \s* ((?= \p{Grapheme_Base}) \X) .* \1 \s* \z /sx; 

、ここでは別です:

use Unicode::Normalize; 
NFD($string) =~/\A \s* ((?= \p{Symbol}) \X) .* \1 \s* \z /sx; 

とここにもう1つあります:

use Unicode::Normalize; 
NFD($string) =~/\A \s* ((?: (?= \p{Symbol}) \X)+) .* \1 \s* \z /sx; 

そして、あなたが非常に限られた状況はと離れて取得することができ:

$string =~/^ (\pS) .* \1 $ /xs; 

しかし、あなたがしなければ、それはいつかあなたがより慎重になっていた希望するつもりだということも考えられます。

+0

ありがとうございます。私は試してみましょう。それが役立つように見えます。 – gzg

1

なぜこれを正規表現で使いたいのですか?宿題ですか?私はこのような簡単なパターンの正規表現を避ける。トムは書記素対文字文句ますので

use Unicode::Normalize qw(NFC); 
$s = NFC($s); 

substr($s, 0, 1) eq substr($s, -1, 1); 

、あなたもそれを処理することができます:長さ1と大きいと

use v5.10.1; 
use Unicode::GCString; 
use Unicode::Normalize qw(NFC); 

my $gcs = Unicode::GCString->new(NFC($s)); 
$gcs->substr(0, 1) eq $gcs->substr(-1, 1) 
+1

'$ gcs-> substr(0,1)'と '$ gcs-> substr(-1,1)'がほしいと確信しています。そして、問題があっても、両辺が最初に同じ形式に正規化されないと、それが必ずしも機能しないからです。さて、あなたは 'Unicode :: Collat​​e-> new-> eq($ gcs-> substr(0,1)、$ gcs-> substr(-1,1))'と呼ぶことができますが、 ;最初に正規化するのが最善です。 - しかし、大部分は、空白や制御文字、孤立したマークではなく、空白に耐えられるように、適切な印刷文字を得ることが大抵でした。 – tchrist

+0

はい、常に正規化してください。 IO層を作るというあなたの提案には何が起こったのですか?(メールで話したことがありましたか?) –

+1

いいえ、 ' - > as_string'を使うことはできません。 '" \ x {305} xxx b \ x {305} "'コードポイントで動作する 'substr'関数ではなく、graphemesで動作する実際の' - > substr'メソッドを使用する必要があります。 - 私はp5pのI/Oレイヤーのことをある程度前に言及しているかもしれません。私は思い出しません。私は、前処理と後処理のために二重バックグラウンドフォークを使ってこれをシミュレートしたコードを送ったと思います。 – tchrist

0

これらの正規表現のマッチ文字列。式では、(.)はキャプチャグループを表しています。このグループでは、私の推測するシンボルのクラスでドットを置き換える必要があります(Unicode Guruの記事を参照してください)。

この正規表現の文脈は一行(/s修飾語)です。それはドットが 改行だけでなく、他のもの(例えば[\s\S])と一致するようにします。改行を組み込み、最も外側の区切り文字にすることができます。 \zは、(文字列の最後にマッチがよりcommonaある)$が改行前に一致する可能性がシナリオを補正以外\zを使用

は、(/sモード)$と同じです。問題の文字が改行であり、貪欲でない量指定子(.*?など)を使用していて、ターゲット文字列が "\ nasdf \ n \ n"の場合、最終改行の前に偽りに一致する可能性があります。しかし、それは試合がすべて貪欲であるため、根本的な問題である。それでも、笑いのためにそれを残す。

/^(?=(.)).*\1\z/s 

/^(?=(\w)).*\1\z/s 

ちょうど単語クラスの文字を規定

/ 
^   # Beginning of string 
(?=(.))  # Lookahead - capture grp1, first (any) character (but don't consume it) 
.*   # Optionally consume all the characters up until before the last character 
\1   # Backreference to capture grp1, this must exist 
\z   # End of string 
/s # s modifier 

例を拡大して再度、単に「シンボル」を定義し

+0

'/ s'は' $ 'アンカーに影響しません。あなたは '/ m'について考えています。 '/ s'は単にaを許可します。改行にマッチするしかし、デフォルトの '/ m'は、論理行の先頭に'^'をマッチさせるので、Tomは代わりに' \ A'を使います。 '\ w'は英数字以上にもマッチします。これは任意の識別子文字です。 –

+0

@brian Dのフォイ - (、/^differnt効果の/^(?=(.)).*\1$/の、/^(?=(.)).*?\1$/sを説明しましたか? =(。))。* \ 1 $/s、/^(?=(.)).*?\1\z/s、/^(?=(.)).*\1\z/s when '\ n'、' \ n \ n'、または '\ n \ n \ n'のターゲット文字列にマッチします。 '\ n'が選択可能な文字でない場合はその疑問があります。私は頭を上げてくれたので、より広い規定として '/ ^(?=([^ \ W _]))。* \ 1 \ z/s'を使用することができたと思います。そして、私のために私の投稿をハイライトしてくれてありがとう。 – sln

関連する問題