2012-03-20 2 views

ответ

7

Я подозреваю, что вы опубликовали фактическое обращение вспять, где более короткий текст на самом деле является шаблоном, а более длинный вход - сопоставляемым входом. В этом случае это вернет true, поскольку шаблон соответствует всем, кроме последней буквы в слове.

Для уточнения, العسكري - это шаблон, и العسكرية - это вход. Поскольку я знаю арабский, я могу сказать вам, что последнее действительно будет частичным совпадением первого, поэтому результат будет правдой, если бы значения были фактически отменены. Если вы ссылаетесь на this table of Arabic alphabets, вы можете видеть, что письмо yā ' (внизу таблицы) - это то же письмо. Его внешний вид зависит от того, где это происходит словом. В первом слове оно появляется в конце, а во втором - второе.

Когда я копирую/вставляю из сообщения, значения меняются, что приводит к истинному значению. Для того, чтобы работать с этим лучше, мы можем разделить слова друг от друга, чтобы увидеть ожидаемые результаты в обоих сценариях:

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' возвращает 'true' для двух строк. – dtb

+0

@dtb странно, когда я вставляюсь из сообщения OP, я становлюсь истинным, хотя, как я уже сказал, значения меняются на противоположные, что дает частичное совпадение. –

+0

@dtb Я верю в это, используя переменные из моего образца кода: 'new CultureInfo (« ar »). CompareInfo.IsPrefix (второй, первый)' - вы это поняли? –

1

Кажется, что Regex.IsMatch() говорит, есть ли вхождение регулярного выражения в строке, а не о том, что вся строка совпадает с регулярным выражением (согласно документам, это «Indicates whether the specified regular expression finds a match in the specified input string.»). Первый аргумент вводится, другой - шаблон в соответствии с документами, но здесь он выглядит наоборот. Последний (самый левый) символ выглядит как другой в двух строках, но, вероятно, из-за того, как визуализируются лигатуры. Когда сбрасывали в 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 !! Не показывать байты, показывать символы Unicode, например 'Regex.IsMatch (" \ x {627} \ x {644} \ x {639} \ x {633} \ x {643} \ x {631} \ x { 64A} \ x {629} "," \ x {627} \ x {644} \ x {639} \ x {633} \ x {643} \ x {631} \ x {64A} ")' или лучше но 'Regex.IsMatch (" \ N {ARABIC LETTER ALEF} \ N {ARABIC LETTER LAM} \ N {ARABIC LETTER AIN} \ N {ARABIC LETTER SEEN} \ N {ARABIC LETTER KAF} \ N {ARABIC LETTER REH} \ N {ARABIC LETTER YEH} \ N {ARABIC LETTER TEH MARBUTA} "," \ N {ARABIC LETTER ALEF} \ N {ARABIC LETTER LAM} \ N {ARABIC LETTER AIN} \ N {ARABIC LETTER SEEN} \ N {ARABIC ПИСЬМО KAF} \ N {ARABIC LETTER REH} \ N {ARABIC LETTER YEH} ")'. Существуют простые инструменты для показа этих форм. – tchrist

2

Это интересный результат правил визуализации текста, предназначенных для прозы, а не кода.

Первый аргумент в вызове метода, как указано выше, - это «العسكرية», аргумент, который отображается (*) с правой стороны. Этот более длинный аргумент - это вход, а более короткая подстрока, отображаемая слева, на самом деле является шаблоном, следовательно, является совпадением.

(*: предполагается, что ваш браузер знает, как сделать рендеринг справа налево. Если вы вставляете фрагмент кода в редактор или консоль, где нет сложной поддержки текстового макета, вы увидите ее для чего это действительно ... хотя арабский язык будет сломан.)

Фокус в том, что знаки пунктуации, такие как знаки кавычек и запятая, являются бесцельными, поэтому могут отображать слева направо или справа налево в зависимости от их окружения. Логический порядок фрагменте кода:

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

(Который имеет дополнительное свойство запутанным, что котировки, которые кажутся вокруг каждого отдельного параметра, на самом деле не являются.)

Это делает какой-то спорный смысл для растяжек читаемого смешанного языка, но делает код очень запутанным! Вы можете остановить это происходит разбивая пробег бесцельных символов с чем-то, что оставил к правой направленности:

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

Это функционально и тот же код, как и оригинал, но он показывает совсем по-другому. Вы можете просматривать позиции разделов аргументов при вводе первой латинской буквы.

Смежные вопросы