Страницы

Поиск по вопросам

пятница, 20 декабря 2019 г.

Регулярное выражение \W+ не находит символ “_” в строке

#c_sharp #регулярные_выражения


Согласно документации языка С#:


  \W - Соответствует любому символу, который не является буквенно-цифровым
  знаком.


Мне казалось логичным предположить, что символ нижнего подчеркивания - "_" попадает
под данное определение. 

Но на практике оказалось, что регулярное выражение - @"\W+" не находит символ нижнего
подчеркивания в строке - @"@$^&#№_\|/*-+=~%{}()[];:,.!?'"""`

Объясните пожалуйста, почему регулярное выражение, не находит символ нижнего подчеркивания
-"_"?
    


Ответы

Ответ 1



Под \W попадают все символы, кроме тех, что попадают под \w. В C# под \w попадают буквы (не A-Za-z, а все символы, из определенных категорий Unicode, включая кириллицу), цифры, и спецсимволы из категории Punctuation, Connector. Символ _ входит в категорию Punctuation, Connector (там кроме него еще десяток символов, вроде ﹍ и ⁀). Если проблема только с _ - явно добавьте его в список символов: [\W_]+. Если хотите захватить все Punctuation, Connector - добавляйте весь класс все не-бувкы и не-цифры - добавляйте весь класс: [\W\p{Pc}]+.

Ответ 2



И так, нужно вспомнить, что обратное метасимволу \W является \w, который можно записать, как [a-zA-Z0-9_] то есть, символ, который используется в словах. Обычно он включает в себя все буквы, все цифры и знак подчеркивания _, исходя из этого, мы теперь знаем, что подчеркивание входит в группу \w, а метасимвол \W включает в себя все, кроме символов, определяемых метасимволом \w. Поэтому в вашем случае можно записать выражение, как @"[\W_]+"?

Комментариев нет:

Отправить комментарий