Удалите пробелы, кроме неразрывных пробелов [дубликат]

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

С помощью

if (condition){
    function myfunction(){
        // Some code
    }
}

это определение myfunction переопределит любое предыдущее определение, так как оно будет выполнено во время синтаксического анализа.

Хотя

if (condition){
    var myfunction = function (){
        // Some code
    }
}

выполняет правильную работу по определению myfunction только тогда, когда condition выполнено.

12
задан Dan Roberts 26 June 2013 в 19:28
поделиться

5 ответов

Вы можете использовать отрицание класса \w (-> \W) и исключить его:

^([^\W_]+)$
8
ответ дан Casimir et Hippolyte 21 August 2018 в 19:31
поделиться
  • 1
    Creative, но я не думаю, что OP ожидал такого ответа, он хочет исключить персонажа в общем случае. Хорошая идея, хотя – HamZa 26 June 2013 в 19:40
  • 2
    – Casimir et Hippolyte 26 June 2013 в 19:42
  • 3
    @CasimiretHippolyte Я должен был подумать об этом. HamZa прав, что я искал более общий случай, но woah ... \ p ... спасибо, что указали, что я никогда не использовал его. – Dan Roberts 26 June 2013 в 19:50
  • 4
    @CasimiretHippolyte не все случаи. Это нельзя использовать для исключения символа из диапазона;). – Martin Ender 26 June 2013 в 19:52
  • 5
    Не все двигатели RE поддерживают это. – Donal Fellows 26 June 2013 в 20:43

Отрицательный взгляд - правильный путь, насколько я понимаю ваш вопрос:

^((?!_)\w)+$
6
ответ дан Denis de Bernardy 21 August 2018 в 19:31
поделиться

Это действительно зависит от вашего регулярного выражения.

.NET

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

[\w-[_]]

. Если за - следует вложенный класс символов, он вычитается. Просто как это ...

Java

... предоставляет гораздо более богатый набор функций набора символов символа . В частности, вы можете получить пересечение двух наборов, таких как [[abc]&&[cde]] (что в данном случае даст c). Пересечение и отрицание вместе дают вам вычитание:

[\w&&[^_]]

Все остальные ароматы

... (которые поддерживают lookaheads) позволяют вам имитировать вычитание с помощью отрицательного вида:

(?!_)\w

Это сначала проверяет, что следующий символ не является _, а затем соответствует любому \w (который не может быть _ из-за негативного просмотра).

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

14
ответ дан Martin Ender 21 August 2018 в 19:31
поделиться

Попробуйте использовать вычитание:

[\w&&[^_]]+

Примечание. Это будет работать на Java, но не может быть в каком-то другом двигателе Regex.

4
ответ дан Rohit Jain 21 August 2018 в 19:31
поделиться

Это можно сделать в 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_--[ ]]+')
3
ответ дан Wiktor Stribiżew 21 August 2018 в 19:31
поделиться
Другие вопросы по тегам:

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