Найти любой литерал с регулярным выражением - PullRequest
0 голосов
/ 23 октября 2009

в моей программе на C # у меня есть текстовый анализатор регулярных выражений, который находит все вхождения слов, которые заключены в квадратные скобки. Например, [[что угодно]] найдет слово что угодно.

На втором шаге я хочу посчитать, как часто найденное слово (в моем примере: что угодно) появляется во всем тексте. Для этого я пытаюсь создать RE, которое содержит найденное слово и подсчитывает, сколько совпадений я получаю. Проблема в том, что найденное слово также может содержать специальные символы и следующее регулярное выражение:

string foundWord = "(anything";
Regex countOccurences = new Regex(foundWord);

явно потерпит неудачу, когда переменная содержит специальные символы, такие как '('. Expresso предлагает для сопоставления целых выражений следующую конструкцию:

Regex countOccurences = new Regex("(?(" + foundWord + ")Yes|No)");

но когда в этом сценарии foundWord является числом, таким как '2009', RE пытается интерпретировать его как ссылку на группу (которая, очевидно, не определена). В моем тексте может быть любая комбинация обычных символов, специальных символов, чисел и т. Д.

Как я могу сказать RE интерпретировать данную строку только как буквальное выражение?

Заранее спасибо, Frank

Ответы [ 2 ]

6 голосов
/ 23 октября 2009

Вы должны экранировать литерал перед построением с ним регулярного выражения, используя Regex.Escape

Что-то вроде:

Regex countOccurances = new Regex(Regex.Escape(foundWord));

Однако, поскольку все, что вы делаете, это подсчет вхождений, лучшим вариантом будет вообще не использовать регулярное выражение для второго поиска. Поскольку вам не нужны какие-либо специальные символы, было бы проще выполнить простой текстовый поиск.

1 голос
/ 23 октября 2009

если вы просто пытаетесь подсчитать количество вхождений строки, зачем вообще использовать регулярное выражение? Просто используйте ваши базовые строковые библиотеки, contains (), indexOf (), все, что больше всего имеет смысл в C #. Но если вам не нужна необычная функциональность регулярного выражения, зачем использовать регулярное выражение? Я думаю

int position = string.indexOf(foundString);
while(position != -1)
{
    count++;
    position = string.indexOf(foundString, position + 1);
}

сделает это без регулярных выражений.

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