2012-03-20 22 views

答えて

7

投稿した内容が実際には逆転していると思われます。短いテキストは実際はパターンであり、長い入力は入力と照合されます。その場合、パターンは単語の最後の文字以外のすべてと一致するため、これはtrueを返します。

العسكريがパターンであり、العسكريةが入力です。私はアラビア語を知っているので、後者は実際には前者と部分的に一致していると言えるので、値が実際には逆になっても結果は真です。 this table of Arabic alphabetsを参照すると、y''(表の一番下にある)という文字が問題の同じ文字であることがわかります。その出現は、単語の中でどこに出現するかに依存する。前者の言葉では、最後に現れ、後者では2番目に手紙です。

投稿からコピー/貼り付けすると、値が逆になり、真の値になります。このより良いで動作するように、我々は両方のシナリオで期待どおりの結果を見るために離れて単語を分割することができます。

string first = "العسكري"; 
string second = "العسكرية"; 
Console.WriteLine(Regex.IsMatch(first, second)); // false 
Console.WriteLine(Regex.IsMatch(second, first)); // true 
+0

私はアラビア語に慣れていませんが、 'new CultureInfo( "ar")、CompareInfo.IsPrefix'、 "new CultureInfo(" ar ")のどちらでもありません。CompareInfo.IsSuffix'は2つの文字列に対して' true'を返します。 。 – dtb

+0

@dtb奇妙なことに私がOPの投稿から貼り付けると、私が言ったように値は逆になり、部分一致が得られます。 –

+0

@dtbこれは、私のサンプルコードの変数を使用してtrueになります: 'new CultureInfo(" ar ")。CompareInfo.IsPrefix(second、first)' - あなたはそれを取得しますか? –

1

全体ではなく、文字列こと、Regex.IsMatch()は、文字列の正規表現の発生があるかどうかを伝えているようです正規表現にマッチします(ドキュメントによると "Indicates whether the specified regular expression finds a match in the specified input string.")。最初の引数は入力であり、もう1つはドキュメントに従ったパターンですが、ここでは逆の方法があります。最後の(一番左の)文字は2つの文字列の中の異なる文字のように見えますが、おそらく合字がレンダリングされるためです。 UTF-8バイトとしてダンプすると、文字列は次のとおりです。

d8 a7 d9 84 d8 b9 d8 b3 d9 83 d8 b1 d9 8a 

d8 a7 d9 84 d8 b9 d8 b3 d9 83 d8 b1 d9 8a d8 a9 

ので、最初は、実際の引数の順序のために(それが必要ない試合を説明するだろう他の部分文字列であります実際にドキュメントの内容と逆にする)。

+0

ICK!バイトを表示しない、 'Regex.IsMatch(" \ x {627} \ x {644} \ x {639} \ x {633} \ x {643} \ x {631} \ x { 64A} \ x {643} \ x {623} \ x {643} \ x {643} \ x {643} \ N {アラビア語のレット} \ N {アラビア語のレター} \ N {アラビア語のレター} \ N {アラビア語のレット} \ N {アラビア語のレット} \ N \ N {アラビア語のレター} \ N {アラビア語のレター} \ N {アラビア語のレター} \ N {アラビア語のレターの名前} \ N {アラビア語のレターの名前} \ N {アラビア語のレターの名前} KAF} \ N {アラビア語レター} \ N {アラビア語レターYEH} ")。これらのフォームを表示するための簡単なツールがあります。 – tchrist

2

これは、コードではなく散文用に設計されたテキストレンダリングルールの興味深い結果です。

上記のように、メソッド呼び出しの最初の引数は、右側にレンダリングされる引数(*)である "العسكرية"です。このより長い引数は入力であり、左に表示される短い部分文字列は実際にはパターンなので一致します。

(*:これは、ブラウザが右から左へのレンダリングを行う方法を知っていることを前提としています。複雑なテキストレイアウトのサポートを持たないエディタまたはコンソールにコードスニペットを貼り付けると、

トリックは、引用符やコンマのような句読点は方向がないため、左から右または右から左にレンダリングすることができますその周囲に応じて。スニペットの論理的な順序は次のとおりです。

>>>>>>>>>>>>>>> 
       <<<<<<<<<<<<<<<<<<< 
            >> 
Regex.IsMatch("العسكرية", "العسكري") 

(それぞれ別々のパラメータの周りのように見える引用符は、実際にはないことをさらに紛らわしい性質を有しています。)

これは、可読性の高い混在言語の拡張について、ある種の議論の余地がありますが、コードは非常に混乱します。

Regex.IsMatch("العسكرية", /* foo */ "العسكري") 

これは、機能的にオリジナルと同じコードですが、それは全く異なる表示されます。あなたはそれを左から右にいるの方向何かで方向性の文字の実行を壊すことで起こって停止することができます。最初のラテン文字を入力すると、引数の位置を見ることができます。

関連する問題