Другое

Как удалить неалфавитно-цифровые символы, сохраняя дефисы и пробелы

Узнайте, как удалить нежелательные символы из строк, сохраняя дефисы и пробелы, используя регулярные выражения в языках программирования с примерами.

Как удалить все неалфавитно‑цифровые символы из строки, сохранив тире и пробелы?

Чтобы удалить все символы, не являющиеся буквенно‑цифровыми, при этом сохранив тире и пробелы, можно использовать регулярное выражение, которое сопоставляет любой символ, который не является буквой, цифрой, тире или пробелом, и заменяет найденные совпадения пустой строкой. Самый распространённый шаблон для этой задачи — [^a-zA-Z0-9 -], который эффективно нацеливается на нежелательные символы, оставляя нужную пунктуацию нетронутой.

Содержание

Понимание шаблона регулярного выражения

Основное решение опирается на шаблон регулярного выражения, который определяет символы, подлежащие удалению. Шаблон [^a-zA-Z0-9 -] работает следующим образом:

  • [ и ]: определяют класс символов
  • ^: инвертирует класс (совпадает с любым символом, НЕ входящим в класс)
  • a-zA-Z: сопоставляет все строчные и прописные буквы
  • 0-9: сопоставляет все цифры
  • : сохраняет пробелы
  • -: сохраняет тире

Согласно статье на devgem.io, этот шаблон «совпадает с любым символом, который не является заглавной или строчной буквой, цифрой, тире или пробелом», и замена совпадений пустой строкой эффективно удаляет нежелательные символы.


Реализация в различных языках программирования

JavaScript

В JavaScript подход использует метод replace() с регулярным выражением:

javascript
const str = 'Hello World! How are you? 123-456';
const result = str.replace(/[^a-zA-Z0-9 -]/g, '');
console.log(result); // "Hello World How are you 123-456"

Этот метод удаляет все неалфавитно‑цифровые символы, сохраняя пробелы и тире. Флаг g гарантирует замену всех вхождений, а не только первого. Как отмечает GeeksforGeeks, «Регулярные выражения предоставляют лаконичный способ сопоставления и удаления неалфавитно‑цифровых символов».

Python

В Python можно использовать функцию re.sub():

python
import re

text = "Hello@World! How are you? 123-456"
result = re.sub(r'[^a-zA-Z0-9 -]', '', text)
print(result)  # "HelloWorld How are you 123-456"

Функция re.sub() принимает шаблон, строку замены (пустую в данном случае) и исходный текст. Согласно статье на Flexiple, «Функция re.sub() используется с шаблоном [^a-zA-Z0-9], который сопоставляет любой символ, не являющийся буквой или цифрой».

C#

C# предлагает несколько подходов. Вот решение с использованием регулярного выражения:

csharp
using System.Text.RegularExpressions;

string input = "Hello@World! How are you? 123-456";
string result = Regex.Replace(input, @"[^a-zA-Z0-9 -]", "");
Console.WriteLine(result); // "HelloWorld How are you 123-456"

Для более SEO‑дружественного форматирования можно добавить дополнительную обработку:

csharp
private string MakeUrlString(string input)
{
    var array = input.ToCharArray();
    array = Array.FindAll<char>(array, c => char.IsLetterOrDigit(c) || char.IsWhiteSpace(c) || c == '-');
    var newString = new string(array).Replace(" ", "-").ToLower();
    return newString;
}

Этот пример из Stack Overflow демонстрирует, как создать URL‑дружественные строки, сохраняя тире и пробелы, а затем преобразуя пробелы в тире и переводя всё в нижний регистр.

PHP

В PHP функция preg_replace() отлично подходит для этой задачи:

php
$string = "Hello@World! How are you? 123-456";
$result = preg_replace("/[^A-Za-z0-9 -]/", '', $string);
echo $result; // "HelloWorld How are you 123-456"

Чтобы включить пробелы в результат, Uptimia отмечает, что «нужно добавить пробел в шаблон регулярного выражения».

Java

Java предоставляет аналогичную функциональность с регулярными выражениями:

java
import java.util.regex.*;

public class Main {
    public static void main(String[] args) {
        String input = "Hello@World! How are you? 123-456";
        Pattern pattern = Pattern.compile("[^a-zA-Z0-9 -]");
        Matcher matcher = pattern.matcher(input);
        String result = matcher.replaceAll("");
        System.out.println(result); // "HelloWorld How are you 123-456"
    }
}

Практические примеры и варианты использования

Создание SEO‑дружественных URL

Обычный случай — создание чистых URL из заголовков или названий:

javascript
// Вход: "My Blog Post: 5 Tips for Success!"
// Выход: "My Blog Post 5 Tips for Success" (затем преобразовать в нижний регистр и пробелы в тире)

function createSlug(title) {
    return title
        .replace(/[^a-zA-Z0-9 -]/g, '')  // Удалить нежелательные символы
        .replace(/\s+/g, '-')            // Заменить пробелы на тире
        .toLowerCase();                  // Перевести в нижний регистр
}

console.log(createSlug("My Blog Post: 5 Tips for Success!"));
// Вывод: "my-blog-post-5-tips-for-success"

Очистка данных для баз данных

При подготовке данных к хранению в базе данных можно очистить текстовые поля:

python
def clean_text_field(text):
    """Удалить неалфавитно‑цифровые символы, но сохранить пробелы и тире"""
    if not text:
        return text
    return re.sub(r'[^a-zA-Z0-9 -]', '', text)

# Пример использования
raw_input = "Customer Name: John Doe - Order #123"
cleaned = clean_text_field(raw_input)
print(cleaned)  # "Customer Name John Doe Order 123"

Проверка пользовательского ввода

Для форм, где нужно ограничить ввод только буквенно‑цифровыми символами, пробелами и тире:

javascript
function isValidInput(input) {
    // Возвращает true, если ввод содержит только буквенно‑цифровые символы, пробелы и тире
    return /^[a-zA-Z0-9 -]*$/.test(input);
}

console.log(isValidInput("John-Doe 123"));  // true
console.log(isValidInput("John@Doe"));     // false

Проблемы производительности

При работе с большими строками или обработке множества строк в цикле важна производительность. Согласно Salesforce Stack Exchange, часто задаётся вопрос, какой подход быстрее — особенно при обработке большого количества строк, требующих очистки.

Регулярное выражение против обработки символов по одному

Подход с регулярным выражением (обычно быстрее в большинстве случаев):

javascript
// Быстро для большинства случаев
const result = str.replace(/[^a-zA-Z0-9 -]/g, '');

Обработка символов по одному (может быть быстрее в некоторых специфических случаях):

javascript
// Ручная обработка
let result = '';
for (let char of str) {
    if (/[a-zA-Z0-9 -]/.test(char)) {
        result += char;
    }
}

Для очень больших строк компилированные шаблоны регулярных выражений могут обеспечить лучшую производительность. В C# можно использовать флаг RegexOptions.Compiled:

csharp
// Используйте компилированное регулярное выражение для лучшей производительности при многократных операциях
string result = Regex.Replace(input, @"[^a-zA-Z0-9 -]", "", RegexOptions.Compiled);

Память

При обработке очень больших текстов стоит рассмотреть потоковую обработку или обработку по частям, чтобы минимизировать потребление памяти.


Расширенные варианты

Сохранение дополнительных символов

Если нужно сохранить дополнительные символы, такие как подчеркивания или апострофы, просто добавьте их в шаблон:

javascript
// Сохраняем буквенно‑цифровые символы, пробелы, тире, подчеркивания и апострофы
const result = str.replace(/[^a-zA-Z0-9 _'-]/g, '');

Поддержка Unicode

Для обработки международных символов используйте шаблоны, учитывающие Unicode:

javascript
// Включаем Unicode‑буквы и числа
const result = str.replace(/[^\p{L}\p{N} -]/gu, '');

Этот шаблон использует свойства Unicode (\p{L}) для букв и (\p{N}) для чисел из всех языков, а не только английского.

Чувствительность к регистру

Шаблоны, приведённые выше, чувствительны к регистру. Для нечувствительного к регистру сопоставления используйте соответствующие флаги:

javascript
// Нечувствительный к регистру подход
const result = str.replace(/[^a-z0-9 -]/gi, '');

Флаг i делает шаблон нечувствительным к регистру, поэтому он сопоставляет как заглавные, так и строчные буквы без необходимости указывать a-zA-Z.


Источники

  1. How do I remove all non alphanumeric characters from a string except dash? - Stack Overflow
  2. Removing Non‑Alphanumeric Characters from a String Except for Dashes and Spaces – devgem.io
  3. How To Remove Non‑Alphanumeric Characters From A String in PHP? - Uptimia
  4. Remove all non‑alphanumeric Characters from a String in JS | bobbyhadz
  5. Removing Non‑Alphanumeric Characters in Python - Flexiple
  6. JavaScript Program to Remove Non‑Alphanumeric Characters from a String - GeeksforGeeks
  7. How to remove all non‑alphanumeric characters from a string in Java - GeeksforGeeks
  8. Remove non‑alphanumeric characters from a string in Go (Golang) | gosamples.dev
  9. Apex: Is there a way to strip out non‑alphanumeric characters from a string? - Salesforce Stack Exchange

Заключение

Удаление неалфавитно‑цифровых символов при сохранении тире и пробелов — распространённая задача обработки текста, которую можно эффективно решить с помощью регулярных выражений. Ключевой шаблон [^a-zA-Z0-9 -] обеспечивает надёжное решение во множестве языков программирования.

Ключевые выводы:

  • Используйте шаблоны регулярных выражений с отрицательным классом для целевого удаления нежелательных символов.
  • Большинство языков предоставляют встроенные функции для замены с помощью регулярных выражений.
  • Учитывайте влияние производительности при работе с большими объёмами текста.
  • Расширяйте шаблоны при необходимости сохранять дополнительные символы.
  • Применяйте дополнительные преобразования, такие как перевод в нижний регистр и замена пробелов на тире, для создания SEO‑дружественных результатов.

Независимо от того, создаёте ли вы веб‑приложения, очищаете данные для баз данных или обрабатываете пользовательский ввод, эти техники помогут вам поддерживать чистые, читаемые строки, сохраняя важную пунктуацию, которую вы хотите оставить. Выберите реализацию, наиболее подходящую для вашего языка программирования и требований к производительности.

Авторы
Проверено модерацией
Модерация