Иллюстрация, когда нужно предпочесть первый метод ко второму, - это когда вам нужно избегать переопределения предыдущих определений функции.
С помощью
if (condition){
function myfunction(){
// Some code
}
}
это определение myfunction
переопределит любое предыдущее определение, так как оно будет выполнено во время синтаксического анализа.
Хотя
if (condition){
var myfunction = function (){
// Some code
}
}
выполняет правильную работу по определению myfunction
только тогда, когда condition
выполнено.
Вы можете использовать отрицание класса \w
(-> \W
) и исключить его:
^([^\W_]+)$
Отрицательный взгляд - правильный путь, насколько я понимаю ваш вопрос:
^((?!_)\w)+$
Это действительно зависит от вашего регулярного выражения.
... предоставляет только одну операцию набора простых символов: вычитание . Этого достаточно для вашего примера, поэтому вы можете просто использовать
[\w-[_]]
. Если за -
следует вложенный класс символов, он вычитается. Просто как это ...
... предоставляет гораздо более богатый набор функций набора символов символа . В частности, вы можете получить пересечение двух наборов, таких как [[abc]&&[cde]]
(что в данном случае даст c
). Пересечение и отрицание вместе дают вам вычитание:
[\w&&[^_]]
... (которые поддерживают lookaheads) позволяют вам имитировать вычитание с помощью отрицательного вида:
(?!_)\w
Это сначала проверяет, что следующий символ не является _
, а затем соответствует любому \w
(который не может быть _
из-за негативного просмотра).
Обратите внимание, что каждый из этих подходов является полностью общим, поскольку вы можете вычесть два произвольно сложных класса символов.
Попробуйте использовать вычитание:
[\w&&[^_]]+
Примечание. Это будет работать на Java, но не может быть в каком-то другом двигателе Regex.
Это можно сделать в python с модулем regex . Что-то вроде:
import regex as re
pattern = re.compile(r'[\W_--[ ]]+')
cleanString = pattern.sub('', rawString)
Обычно вы устанавливаете модуль regex с помощью pip :
pip install regex
EDIT:
Модуль регулярных выражений имеет два варианта поведения: версия 0 и версия 1. Упорядочение (как указано выше) - это поведение версии 1. Требование pypi docs версии 1 является поведением по умолчанию, но вы можете обнаружить, что это не так. Вы можете проверить с помощью
import regex
if regex.DEFAULT_VERSION == regex.VERSION1:
print("version 1")
Чтобы установить его в версию 1:
regex.DEFAULT_VERSION = regex.VERSION1
или использовать версию 1 в одном выражении:
pattern = re.compile(r'(?V1)[\W_--[ ]]+')