Удаление нечисловых и неальфа-символов из строки? - PullRequest
7 голосов
/ 09 февраля 2009

Каков наилучший способ удалить все специальные символы из строки, например:

!

@ # $% ^ & * () {} |:. "> <, /; '[] \ = - </p>

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

Thx

Среда == C # /. NET

Ответы [ 9 ]

6 голосов
/ 09 февраля 2009

Обычно лучше иметь белый список, чем черный.

В Regex есть удобное \w, которое фактически означает буквенно-цифровой плюс подчеркивание (некоторые варианты также добавляют в список акцентированные символы (á, é, ô и т. Д.), Другие - нет).

Вы можете инвертировать это, используя \W для обозначения всего, что не буквенно-цифровое.

Так что замена \W на пустую строку удалит все «специальные» символы.


В качестве альтернативы, если вам нужен другой набор символов, кроме буквенно-цифровых, вы можете использовать отрицательный класс символов: [^abc] будет соответствовать всему, что не a или b или c и [^a-z] будет соответствовать всему, что не находится в диапазоне a,b,c,d...x,y,z

Эквивалент \w равен [A-Za-z0-9_] и, следовательно, \W равен [^A-Za-z0-9_]

3 голосов
/ 09 февраля 2009

в php:

$tests = array(
     'hello, world!'
    ,'this is a test'
    ,'and so is this'
    ,'another test with /slashes/ & (parenthesis)'
    ,'l3375p34k stinks'
);

function strip_non_alphanumerics( $subject )
{
    return preg_replace( '/[^a-z0-9]/i', '', $subject );
}

foreach( $tests as $test )
{
    printf( "%s\n", strip_non_alphanumerics( $test ) );
}

вывод будет:

helloworld
thisisatest
andsoisthis
anothertestwithslashesparenthesis
l3375p34kstinks
2 голосов
/ 09 февраля 2009

Я предпочитаю регулярное выражение , потому что синтаксис проще читать и поддерживать:

# in Python
import re
re.sub("[abcdef]", "", text)

, где abcdef - , правильно экранированные символов, которые необходимо удалить.

В качестве альтернативы, если вам нужны только буквенно-цифровые символы (плюс подчеркивание), вы можете использовать:

re.sub("\W", "", text)

, где \W представляет несловный символ , т.е. [^a-zA-Z_0-9].

1 голос
/ 09 февраля 2009

вот простое регулярное выражение

[^\w]

это должно поймать все несловарные символы, это разрешит AZ AZ 0-9 пробел и _ ни пробела, ни _ не было в вашем списке, так что это работает, если вы хотите поймать их также, тогда я бы сделал что-то вроде этого:

/[a-z0-90/i

это формат PHP для a-z и 0-9, i делает его нечувствительным к регистру.

1 голос
/ 09 февраля 2009

Если вы хотите использовать буквенно-цифровые символы, вы можете просто выразить это с помощью инвертированного класса символов:

[^A-Za-z0-9]+

Это означает: каждый символ, который не является буквенно-цифровым.

0 голосов
/ 05 мая 2016

Идеальный подход в PHP был бы ...

$text = "ABCDEF...Á123";
$text = preg_replace( '/[^\p{L}]/i', '', $text);
print($text); # Output: ABCDEFÁ

Или в Perl ...

my $text = "ABCDEF...Á123";
$text =~ s/[^\p{L}]//gi;
print($text); # Output: ABCDEFÁ

Если вы просто совпадете с [^ a-zA-Z], вы пропустите все акцентированные символы, которые (по большей части), я думаю, вы бы хотели сохранить.

0 голосов
/ 09 февраля 2009

Вы можете скорее проверить их на внешнем интерфейсе, получив значения askey для набранных символов.

0 голосов
/ 09 февраля 2009

На каком языке вы собираетесь регулярное выражение?

Например, в Perl вы можете сделать перевод, который переведет любой символ из вашего списка в ничто:

например. Это переведет 'a', 'b', 'c' или 'd' в ''

$sentence =~ tr/abcd//;
0 голосов
/ 09 февраля 2009

Мы использовали команду "tr"?

Ты не говоришь, в какой среде ты находишься ... в раковине? С программой? Джава? У каждого из них будут свои лучшие решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...