Регулярний вираз: знайти пробіли (вкладки / пробіл), але не нові рядки


96

Як я можу мати регулярний вираз, який перевіряє пробіли чи вкладки, але не нові рядки. Я спробував, \sале виявив, що він також перевіряє нові рядки.

Я використовую C # / WPF, але це не має значення.

Відповіді:


189

Використовуйте класи символів: [ \t]


1
Місце на мою проблему. Дивіться також stackoverflow.com/a/25956935/292060 для \hкласу символів лише для perl , але він показує, що існує багато інших символів пробілів, якщо вам потрібно додати їх до списку тут.
goodeye

3
чому раніше має бути пробіл \t?
Окер

4
@Ooker Щоб захопити буквальний простір
codemonkee

Це не збігатиметься з іншими типами пробілів, як зазначалося в інших відповідях.
Гас

1
Чому пробіл перед \ t?
Catbuilts

35

Спробуйте цей набір символів:

[ \t]

Це відповідає лише пробілу або таблиці.


14

Як зазначив @ Eiríkr Útlendi, прийняте рішення враховує лише два пробіли: горизонтальну вкладку (U + 0009) та пробіл (U + 0020). Він не враховує інших символів пробілу, таких як пробіли, що не порушуються (що трапляється в тексті, з яким я намагаюся мати справу). Більш повний перелік символів пробілів міститься у Вікіпедії та також посилається на пов'язану відповідь Perl . Просте рішення C #, яке враховує цих інших символів, можна побудувати за допомогою віднімання класів символів

[\s-[\r\n]]

або, включаючи рішення Eiríkr Útlendi, ви отримуєте

[\s\u3000-[\r\n]]

3

Примітка. Для тих, хто має справу з текстом CJK (китайською, японською та корейською мовами), двобайтовий простір (Unicode \u3000) не включається \sдо жодної реалізації, яку я до цього часу намагався (Perl, .NET, PCRE, Python). Вам потрібно буде спочатку нормалізувати свої рядки (наприклад, замінивши всі \u3000на \u0020), або вам доведеться використовувати набір символів, який включає цю кодову точку на додаток до будь-якого іншого пробілу, на який ви націлюєтеся, наприклад [ \t\u3000].

Якщо ви використовуєте Perl або PCRE, у вас є можливість використовувати \hскорочення горизонтального пробілу , яке включає, серед іншого, однобайтовий простір, двобайтовий простір і вкладку. Див. Пробіл Match, але не нові рядки (Perl), щоб отримати докладнішу інформацію.

Однак ця \hстенограма не була реалізована для .NET та C #, як найкраще мені вдалося сказати.


1
Гарна думка. Java \h(представлена ​​в Java 8) дійсно включає \u3000, але \sне включає, якщо ви не встановите режим UNICODE_CHARACTER_CLASS (представлений в Java 7).
Алан Мур,

0

Якщо ви хочете замінити простір нижче коду, який працював у менеC#

Regex.Replace(Line,"\\\s","");

Для вкладки

Regex.Replace(Line,"\\\s\\\s","");

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.