Регулярное выражение: найдите пробелы (табуляции / пробелы), но не символы новой строки

99

Как получить регулярное выражение, которое проверяет наличие пробелов или табуляций, но не символов новой строки. Я пробовал, \sно обнаружил, что он тоже проверяет новые строки.

Я использую C # / WPF, но это не имеет значения.

Jiew Meng
источник

Ответы:

195

Используйте классы персонажей: [ \t]

Lekensteyn
источник
1
Место для моей проблемы. См. Также stackoverflow.com/a/25956935/292060 для \hкласса символов только для perl , но он показывает, что есть много других пробельных символов, на случай, если вам нужно добавить их в список здесь.
goodeye
3
почему должно быть место раньше \t?
Ooker
4
@Ooker Для захвата буквального пространства
codemonkee
1
Это не будет соответствовать другим видам пробелов, как упоминалось в других ответах.
Gus
1
Почему пробел перед \ t?
Catbuilts
37

Попробуйте этот набор символов:

[ \t]

Это соответствует только пробелу или табулятору.

Гамбо
источник
14

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

[\s-[\r\n]]

или, включая решение Eiríkr tlendi, вы получите

[\s\u3000-[\r\n]]
Erdomke
источник
4

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

Если вы используете Perl или PCRE, у вас есть возможность использовать \hсокращение для горизонтальных пробелов , которые, по-видимому, включают однобайтовое пространство, двухбайтовое пространство и табуляцию, среди прочего. Подробнее см. Ветку Сопоставление пробелов, но не новых строк (Perl) .

Однако, \hнасколько мне удалось судить , это сокращение не было реализовано для .NET и C #.

Eiríkr tlendi
источник
1
Хорошая точка зрения. Java \h(представленная в Java 8) включает \u3000, но \sне включает, если вы не установите режим UNICODE_CHARACTER_CLASS (представленный в Java 7).
Алан Мур
0

Если вы хотите заменить пробел ниже, код работал у меня вC#

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

Для вкладки

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

Самир Бахад
источник