Шаблон игнорирования Regex

77
6

У меня есть текст с некоторыми аннотациями. скобки '(' и ')' или '[' и ']' используются для определения того, что является частью аннотации (это похоже на обычный текст, например, это предложение). Я хочу выполнить регулярное выражение, чтобы искать что-то во входном файле, но... он должен игнорировать все аннотации.

проблемы:

    они могут появляться в любом месте (я не знаю, где и сколько) я не могу их легко скрыть (выполняя замену-regex, чтобы убить все элементы), потому что мне нужно знать индексы и длину после выполнения моего регулярного поиска в исходном тексте он должен быть как можно быстрее на ОГРОМНЫЙ ввод-текст

аннотации не могут быть вложенными, что-то вроде "123 (Hello (Мир))" не появится. если аннотации-скобки являются частью строки (в кавычках), они являются частью текста и поэтому не содержат аннотации.

вот пример:

Input Text: "Hello, my (real) name is John. I worked in England (near London) on a real german restaurant.".

Search Regex: "my.*?real"

Output: "my (real) name is John. I worked in England (near London) on a real" (index=7, length=67)

Каков наилучший способ решить эту проблему?

спросил(а) 2021-01-25T13:44:39+03:00 4 месяца, 4 недели назад
1
Решение
88

Интересно, если RegEx не является вашим другом в этой ситуации. Тем более, что вам нужен самый быстрый алгоритм, возможно, вы должны реализовать это как конечный автомат.

По существу, копируйте строку по одному символу за раз и сохраняйте стек соответствующих разделителей аннотаций. Пока вы не находитесь в аннотации, также смотрите на строку, которую вы пытаетесь сопоставить.

Разъяснение вопросов: можете ли вы предположить, что текст, который вы ищете, является фиксированным литералом? Вы заботитесь о количестве пробелов? Я спрашиваю, потому что, как только вы устраните проблему "аннотации", вам может не понадобиться вся сила RegExes для выполнения остальной части поиска.

ответил(а) 2021-01-25T13:44:39+03:00 4 месяца, 4 недели назад
45

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

my.*?real(?![^(\[]*[\)\]])

ответил(а) 2021-01-25T13:44:39+03:00 4 месяца, 4 недели назад
46

попробуйте этот следующий код, это может быть нам

  public string output { get; set; }

string input="Hello, my [FirstName] name is John. I worked in England [nearLondon] on a real german restaurant.".
static readonly Regex re = new Regex(@"\{([^\}]+)\}", RegexOptions.Compiled);

StringDictionary fields = new StringDictionary();
fields.Add("FirstName", yourname);
fields.Add("nearLondon", yournearLondon);

output = re.Replace(input, delegate(Match match)
{
return fields[match.Groups[1].Value];
});

ответил(а) 2021-01-25T13:44:39+03:00 4 месяца, 4 недели назад
46

  string source =
@"Hello, my (real) name is John. I worked in England (near London) on a real german restaurant.";

Regex regex=new Regex(@"\(.*?\)");

MatchCollection matchCollection= regex.Matches(source);

foreach (Match match in matchCollection)
{
source = source.Replace(match.Groups[0].Value, GetPlaceholderString(match.Groups[0].Length));
}
MessageBox.Show(source);

где GetPlaceholderString делает строку plactholder необходимой длины.

После этого вы можете искать слово ignore и все анотации

ответил(а) 2021-01-25T13:44:39+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема