c # Регулярный вопрос - PullRequest
2 голосов
/ 09 июня 2011

У меня проблема с символом @ в Regex, я пытаюсь удалить @sometext из текстовой строки не может найти нигде, где он использует @ в качестве литерала. Я попробовал себя, но не удаляю слово из строки. Есть идеи?

public string removeAtSymbol(string input)
{
    Regex findWords = new Regex(______);//Find the words like "@text"
    Regex[] removeWords;

    string test = input; 
    MatchCollection all = findWords.Matches(test);
    removeWords = new Regex[all.Count];
    int index = 0;
    string[] values = new string[all.Count];

    YesOutputBox.Text = " you got here";

    foreach (Match m in all) //List all the words
    {
        values[index] = m.Value.Trim();
        index++;
        YesOutputBox.Text = YesOutputBox.Text + " " + m.Value;
    }

    for (int i = 0; i < removeWords.Length; i++)
    {
        removeWords[i] = new Regex(" " + values[i]);

        // If the words appears more than one time
        if (removeWords[i].Matches(test).Count > 1)
        {
            removeWords[i] = new Regex(" " + values[i] + " ");
            test = removeWords[i].Replace(test, " "); //Remove the first word.
        }
    }

    return test;
}

Ответы [ 4 ]

1 голос
/ 09 июня 2011

Вы можете удалить все вхождения "@sometext" из строки test с помощью метода

Regex.Replace(test, "@sometext", "")

или для любого слова, начинающегося с "@", вы можете использовать

Regex.Replace(test, "@\\w+", "")

Если вам нужно определенно отдельное слово (то есть ничего подобного @comp в пределах tom@comp.com), вы можете поставить перед регулярным выражением специальную границу слова (\b здесь не работает):

Regex.Replace(test, "(^|\\W)@\\w+", "")
0 голосов
/ 10 июня 2011

Мне повезло, применяя этот шаблон:

\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, поскольку первую группу захвата нельзя напрямую преобразовать в атомарное утверждение нулевой ширины.

0 голосов
/ 09 июня 2011

Regex для удаления @something из этой строки: я хочу удалить @something из этой строки.

var regex = new Regex("@\\w*");
string result = regex.Replace(stringWithAt, "");

Это то, что вы ищете?

0 голосов
/ 09 июня 2011

Вы можете использовать:

^\s@([A-Za-z0-9_]+)

в качестве регулярного выражения для распознавания имен пользователей Twitter.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...