2015-08-28 4 views
4

я не могу понять, почему регулярное выражение:Почему [^ d w s,] соответствует "leonardo, davinci"?

[^\d\s\w,] 

сопоставляет строку:

"leonardo,davinci" 

То есть мой тест:

$ echo "leonardo,davinci" | egrep '[^\d\w\s,]' 
leonardo,davinci 

Хотя это работает, как ожидалось:

$ echo "leonardo,davinci" | egrep '[\S\W\D]' 
$ 

Большое спасибо

+1

@ blueygh2 все это отрицается. Это может быть связано с эгрепом, никогда не использовавшим его. –

+1

@ blueygh2 Обычно '^' отменяет все в списке между скобками. Я не вижу, как это регулярное выражение могло бы соответствовать этой строке. Насколько я вижу, вы используете только один символ, который не является цифрой, пространственным символом или символом слова. –

+1

Боковое примечание, '[\ d \ w]' избыточно: '\ w = [a-zA-Z0-9_]'. – Sam

ответ

9

Это потому, что egrep не имеет предопределенные наборы \d, \w, \s. Поэтому, поставив слэш перед ними просто сопоставляя их буквально:

Леонар d о, d avinci

echo "leonardo,davinci" | egrep '[^a-zA-Z0-9 ,]' 

Будет ли на самом деле, не совпадают.


Если вы установили его, вы можете использовать вместо pcregrep:

echo "leonardo,davinci" | pcregrep '[^\w\s,]' 
+0

Большое вам спасибо! Та же проблема есть с вкладкой? Он не распознает [^ \ t] как «все за исключением вкладки», а как «все, кроме t» ... – Luca

+0

@Nopaste, справа. Он также не работает для '\ t':' echo -e 'foo \ tbar' | egrep '\ t'' не дает совпадений. – ndn

Смежные вопросы