Мне повезло, применяя этот шаблон:
\B@\w+
Это будет соответствовать любой строке, начинающейся с символа @, который содержит буквенно-цифровые символы, плюс некоторые знаки препинания, такие как символ подчеркивания, если это не такпроисходят на границе между буквенно-цифровыми и не буквенно-цифровыми символами.
Результатом выполнения этого кода:
string result = Regex.Replace(
@"@This1 @That2_thing this2@3that @the5Others @alpha@beta@gamma",
@"\B@\w+",
@"redacted");
является следующая строка:
redacted redacted this2@3that redacted redacted@beta@gamma
Если этот вопрос специфичен для Twitter, то Twitter предоставляет библиотеку с открытым исходным кодом , которая помогает собирать специфичные для Twitter объекты, такие как ссылки, упоминания и хэштеги. Этот java-файл содержит код, определяющий регулярные выражения, которые использует Twitter, и этот yml-файл содержит тестовые строки и ожидаемые результаты многих модульных тестов, которые выполняют регулярные выражения в библиотеке Twitter.
Шаблон сопоставления упоминаний в Твиттере (извлеченный из их библиотеки, измененный для удаления ненужных групп захвата и отредактированный для замены в контексте замены) показан ниже.Совпадение должно выполняться без учета регистра.
(^|[^a-z0-9_])[@\uFF20][a-z0-9_]{1,20}
Вот пример, который воспроизводит результаты первой замены в моем ответе:
string result = Regex.Replace(
@"@This1 @That2_thing this2@3that @the5Others @alpha@beta@gamma",
@"(^|[^a-z0-9_])[@\uFF20][a-z0-9_]{1,20}",
@"$1redacted",
RegexOptions.IgnoreCase);
Обратите внимание на необходимостьвключите подстановку $1
, поскольку первую группу захвата нельзя напрямую преобразовать в атомарное утверждение нулевой ширины.