2009-02-09 3 views
7

Что это лучший способ, чтобы удалить все специальные символы из строки - как это:Удаление ненужных и неалфавых символов из строки?

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

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

Thx

Environment == C#/NET

?.

ответ

3

в 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 
+0

Я могу добавить несколько тестовых примеров с заглавными буквами. –

+0

@jm: это тоже хорошо, я просто слишком ленив, чтобы набирать текст, и «i» после регулярного выражения делает регулярное выражение нечувствительным к регистру;) – Kris

+0

P.S. Почему это принятый ответ, если в вопросе теперь указано, что среда является .NET? (Я не думаю, что это было, когда я ответил). Это было бы не слишком концептуально иначе, например, для C#, но выглядело бы не так. – Kris

0

У нас команда «tr»?

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

6

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

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

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

So заменить \W пустой пустой удалит все специальные символы.


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

эквивалент \w является [A-Za-z0-9_] и, таким образом, является \W[^A-Za-z0-9_]

0

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

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

например Это переведет 'а', 'B', 'C' или 'D' в ''

$sentence =~ tr/abcd//; 
2

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

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

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

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

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

где \W представляет собой несловообразующим характер, т.е. [^a-zA-Z_0-9].

1

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

[^A-Za-z0-9]+ 

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

+0

не совсем, вы забыли A-Z, я думаю :) – Robert

+0

Это может быть упрощено до \ w – UnkwnTech

+0

\ w означает [A-Za-z0-9_], и я не уверен, что он хочет также на низкой линии. – Gumbo

1

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

[^\w] 

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

/[a-z0-90/i 

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

+0

Это неправильно. \ w does * not * include space. Слишком сложно делать «[^ \ w]», а не просто «\ W». И ваше второе выражение не будет работать - оно имеет нуль вместо закрывающей скобки. Это также не специфичный для PHP формат, он работает для разных форм. –

0

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

0

Идеальный подход в 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], вам пропустит все акцентированные персонажи, которые (по большей части), я думаю, вы хотели бы сохранить.