Я должен использовать \d или [0-9] для соответствия цифрам в Perl regex?

Я нашел это на другом сайте:

    import Tkinter

    MyRoot = Tkinter.Tk()
    MyRoot.state("zoomed")

    MyRoot.mainloop()

Это решило мою проблему.

47
задан Nakilon 21 June 2013 в 10:47
поделиться

7 ответов

Для максимальной безопасности я бы предложил использовать [0-9] каждый раз, когда вы специально не собираетесь сопоставлять все цифры, определенные в Unicode.

Per perldoc perluniintro , Perl не поддерживает использование цифр, кроме [0-9] в качестве чисел, поэтому я определенно использовал бы [0-9] , если следующее оба верны:

  1. Вы хотите использовать результат как число (например, выполнять с ним математические операции или сохранять его где-нибудь, где принимаются только правильные числа (например, столбец INT в базе данных)).

  2. Это возможно нецифровые [^ 0-9] будут присутствовать в данных таким образом, что регулярное выражение могло бы им соответствовать. (Обратите внимание, что этот параметр должен всегда считаться истинным для недоверенных / враждебных входных данных.)

Если любой из них является ложным,

40
ответ дан 26 November 2019 в 19:25
поделиться

Мне кажется очень опасным использовать \ d . Это плохое дизайнерское решение в языке, поскольку в большинстве случаев вы хотите [0-9 ] . Кодирование Хаффмана диктует использование \ d для номеров ASCII.

В большинстве предыдущих плакатов уже подчеркивалось, почему вам следует использовать [0-9] , поэтому позвольте мне дать вам немного больше данных:

  • Если я правильно прочитал диаграммы Unicode » ۷۰ '- это число (70 на индикаторе, не верьте мне на слово).

  • Попробуйте следующее:

     $ perl -le' $ one = chr 0xFF11; напечатайте "$ one + 1 =", $ one + 1; '
    1 + 1 = 1
    
  • Вот неполный список действительных чисел (которые могут отображаться или не отображаться в вашем браузере должным образом, в зависимости от используемых шрифтов) для каждого числа, только первое из них интерпретируется как число при выполнении арифметических операций с Perl, как показано выше:

      ZERO: 0٠۰߀०০੦૦ ୦ ௦౦೦൦๐໐0
     ОДИН: 1١۱߁१১੧૧ ୧ ௧౧೧൧๑໑1
     ДВА: 2٢۲߂२২੨૨ ୨ ௨౨೨൨๒໒2
     ТРИ: 3٣۳߃३৩੩૩ ୩ ௩౩೩൩๓໓3
     ЧЕТЫРЕ: 4٤۴߄४৪੪૪ ୪ ௪౪೪൪๔໔4
     ПЯТЬ: 5٥۵߅५৫੫૫ ୫ ௫౫೫൫๕໕5
     ШЕСТЬ: 6٦۶߆६৬੬૬ ୬ ௬౬೬൬๖໖6
     СЕМЬ: 7٧۷߇७৭੭૭ ୭ ௭౭೭൭๗໗7
     ВОСЕМЬ: 8٨۸߈८৮੮૮ ୮ ௮౮೮൮๘໘8
     ДЕВЯТЬ: 9٩۹߉ ९ ৯੯૯ ୯௯౯೯൯๙໙9  
    

Вы все еще не уверены?

57
ответ дан 26 November 2019 в 19:25
поделиться

Согласно perlreref , « \ d » поддерживает локаль и Unicode.

Однако, если вы используете кодовый набор, не Unicode, тогда вам не нужно беспокоиться о цифрах Unicode, и если код, который вы используете, похож на Latin-1 (ISO 8859-1 или 8859-15), то знание локали не повредит вы либо потому, что кодовый набор не включает никаких других цифровых символов.

Таким образом, для многих людей большую часть времени вы можете без проблем использовать ' \ d '. Однако, если данные Unicode являются частью вашей работы, вам необходимо более внимательно подумать о том, что вам нужно.

8
ответ дан 26 November 2019 в 19:25
поделиться

Just like nuking the site from orbit, [0-9] is the only way to be sure. Yeah, it is ugly. Yeah, the choice to make \d be UNICODE and locale aware was stupid. But this is our bed and we have to lie in it.

As for the people ducking their heads in the sand saying it doesn't effect the character set they are using today, well you may be using that character set today, but the rest of the world is using UTF-8 now and you will be using it soon as well. Remember to code like the guy who maintains your code is a homicidal maniac who knows where you live.

Oh, and as for Perl modules using \d vs [0-9], even the core still has UNICODE problems.

If you do in fact mean any digit, but want to be able to do math with the results, you can use Text::Unidecode:

#!/usr/bin/perl

use strict;
use warnings;

use Text::Unidecode;

my $number = "\x{1811}\x{1812}\x{1813}\x{1814}\x{1815}";
print "$number is ", unidecode($number), "\n";

After some more testing it looks like Text::Unidecode doesn't handle all digit characters correctly. I am writing a module that will work.

5
ответ дан 26 November 2019 в 19:25
поделиться

Я чувствую, что оба должны занять свое место. Однако в 99,999% случаев (особенно в моем закрытом большом американском мире сотрудничества) они взаимозаменяемы. Я использую Perl для управления данными каждый день, и ни в одном из наборов данных, с которыми я работаю, нет чисел, которые не помещаются в [0-9] . Однако я понимаю, что существует важное различие между \ d и [0-9] , и хорошо знать об этом различии. Я использую \ d , потому что он кажется более лаконичным (как вы сказали) и никогда не будет «неправильным» в моем маленьком мире манипуляций с данными.

3
ответ дан 26 November 2019 в 19:25
поделиться

Если вы примените \ d к строке Unicode (например, в "\ X {660}" = ~ / \ d / ), он будет соответствовать цифре Unicode. Если вы примените \ d к двоичной строке (например, эквивалент UTF-8 приведенного выше: "\ xd9 \ xa0" = ~ / \ d / ), он будет соответствовать только 10 цифр ASCII. Perl 5.8 не создает строки Unicode по умолчанию (если вы специально не просите об этом, например, в "\ X {...}" или используйте utf8; и т. Д.).

Мой совет: обращайте внимание на разницу между \ d и [0-9] , только если ваше приложение использует строки Unicode.

2
ответ дан 26 November 2019 в 19:25
поделиться

Если [0-9] кажется неуклюжим, возможно, вы могли бы определить: $ d = qr / [0-9] /; и использовать это вместо \ d .

1
ответ дан 26 November 2019 в 19:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: