Регулярное выражение для исключения [закрытых] специальных символов

Глупый мой. Решение было так просто.

Вместо:

class TREE_OT_assign(bpy.types.Operator):

    names = bpy.props.EnumProperty(items=get_items(), update=update())

    def invoke(self, context, event):

Просто используйте:

class TREE_OT_assign(bpy.types.Operator):

    def get_items(........

    def update(.........

    names = bpy.props.EnumProperty(items=get_items, update=update)

    def invoke(self, context, event):

Я пробовал это раньше, но я поместил определение методов ниже определения переменной «names»: /

31
задан TylerH 21 August 2019 в 20:53
поделиться

8 ответов

Я бы просто перечислил белый список символов.

^[a-zA-Z0-9äöüÄÖÜ]*$

Создание черного списка одинаково просто с регулярным выражением, но вам может понадобиться чтобы добавить намного больше символов - в юникоде много китайских символов ...;)

^[^<>%$]*$

Выражение [^ (здесь много символов)] просто соответствует любому символу, которого нет в списке.

40
ответ дан 27 November 2019 в 21:56
поделиться

Чтобы исключить определенные символы (<,>,% и $), вы можете создать регулярное выражение, например:

[<>%\$]

Это регулярное выражение будет соответствовать всем входным данным, в которых есть черный список символов. Скобки определяют класс символов, и перед знаком доллара необходимо указывать символ \, потому что знак доллара имеет особое значение в регулярных выражениях.

Чтобы добавить больше символов в черный список, просто вставьте их в скобки; порядок не имеет значения.

Согласно некоторой документации Java для регулярных выражений , вы можете использовать выражение следующим образом:

Pattern p = Pattern.compile("[<>%\$]");
Matcher m = p.matcher(unsafeInputString);
if (m.matches())
{
    // Invalid input: reject it, or remove/change the offending characters.
}
else
{
    // Valid input.
}
8
ответ дан 27 November 2019 в 21:56
поделиться

Обычно лучше использовать разрешенные символы белого списка, чем запрещенные символы черного списка. как с точки зрения безопасности, так и с точки зрения простоты реализации.

Если вы пойдете по черному списку, вот пример, но будьте осторожны, синтаксис не прост.

http: // groups. google.com/group/regex/browse_thread/thread/0795c1b958561a07

Если вы хотите добавить в белый список все символы ударения, возможно, использование диапазонов Юникода поможет? Проверьте эту ссылку.

http://www.regular-expressions.info/unicode.html

5
ответ дан 27 November 2019 в 21:56
поделиться

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

[^<>%$]

Конструкция «[]» определяет класс символов, который будет соответствовать любому из перечисленных символов. Помещение « ^ » в качестве первого символа отменяет совпадение, т. Е. Любой символ ДРУГОЙ, чем один из перечисленных.

Вам может понадобиться экранировать некоторые символы в пределах «[]», в зависимости от на каком языке / движке регулярных выражений вы используете.

5
ответ дан 27 November 2019 в 21:56
поделиться

Вы действительно хотите занести в черный список определенные символы или, скорее, внести в белый список разрешенные символы?

Я предполагаю, что Вы действительно хотите последнее. Это довольно просто (добавьте любые дополнительные символы в белый список в группу [\ -] ):

^(?:\p{L}\p{M}*|[\-])*$

Редактировать: Оптимизировать шаблон с учетом комментариев из комментариев

2
ответ дан 27 November 2019 в 21:56
поделиться

Почему вы считаете регулярное выражение лучшим инструментом для этого? Если ваша цель - определить, присутствует ли в строке недопустимый символ, тестирование каждого символа в цикле будет проще и эффективнее, чем построение регулярного выражения.

1
ответ дан 27 November 2019 в 21:56
поделиться

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

0
ответ дан 27 November 2019 в 21:56
поделиться

Вот все символы с французским акцентом: àÀâÂäÄáÁéÉèÈêÊëËìÌîïÏòÒôÔöÖùÙûÛüÜçÇ'ñ

Я бы погуглил список символов с немецким акцентом. Их не так уж и много. Вы должны получить их все.

Для URL-адресов я заменяю URL-адреса с диакритическими знаками обычными буквами, например так:

string beforeConversion = "àÀâÂäÄáÁéÉèÈêÊëËìÌîÎïÏòÒôÔöÖùÙûÛüÜçÇ’ñ";
string afterConversion = "aAaAaAaAeEeEeEeEiIiIiIoOoOoOuUuUuUcC'n";
for (int i = 0; i < beforeConversion.Length; i++) {

     cleaned = Regex.Replace(cleaned, beforeConversion[i].ToString(), afterConversion[i].ToString());
}

Возможно, есть более эффективный способ.

1
ответ дан 27 November 2019 в 21:56
поделиться
Другие вопросы по тегам:

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