C# Отфильтровать слово с неопределенным количеством пробелов между символами - PullRequest
2 голосов
/ 23 апреля 2020

Например:

Я могу создать wordt с несколькими пробелами, например:

string example = "**example**";
List<string>outputs = new List<string>();
string example_output = "";
foreach(char c in example)
{
   example_putput += c + " ";
}

И затем я могу l oop, чтобы удалить все пробелы и добавить их в список выходов, проблема есть. Мне нужно, чтобы он работал в сценариях, где есть двойные пробелы и многое другое.

Например.

string text = "This is a piece of text for this **example**.";

Я просто хочу обнаружить И удалить ' пример '

Но я хочу сделать это, даже когда в нем говорится, например, пример, пример или пример.

И в моем сценарии, поскольку это спам-фильтр, я не могу просто заменить пробелы во всем предложении как ниже, потому что мне нужно .Replace (слово с теми же пробелами, что и пользователь, набирающий его).

.Replace(" ", "");

Как бы мне этого добиться?

TLDR: Я хочу отфильтровать слово с несколькими комбинациями пробелов, не изменяя другие части строки.

So example, e xample, e  x ample, e    x   a  m ple

становится фильтрующим словом

Я не возражаю против метода, который может генерировать слово со всеми пробелами как план б.

Ответы [ 4 ]

3 голосов
/ 23 апреля 2020

Вы можете использовать это регулярное выражение для достижения этого: (e[\s]*x[\s]*a[\s]*m[\s]*p[\s]*l[\s]*e)

Ссылка

Do tnet Fiddle

2 голосов
/ 23 апреля 2020

Для этого можно использовать регулярное выражение: e\s*x\s*a\s*m\s*p\s*l\s*e \s означает любой символ пробела, а * означает 0-n счетчика этого пробела.

Небольшой фрагмент:

const string myInput = "e x ample";
var regex = new Regex("e\s*x\s*a\s*m\s*p\s*l\s*e");

var match = regex.Match(myInput);
if (match.Success)
{ 
   // We have a match! Bad word
}

Здесь ссылка для регулярного выражения: https://regex101.com/r/VFjzTg/1

1 голос
/ 23 апреля 2020

Я вижу, что проблема состоит в том, чтобы игнорировать пробелы в строке соответствия, но не касаться их где-либо еще в строке.

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

    // prepare regex. Need to do this only once for many applications.
    string findword = "example";
    // TODO: would need to escape special chars like * ( ) \ . + ? here.
    string[] tmp = new string[findword.Length];
    for(int i=0;i<tmp.Length;i++)tmp[i]=findword.Substring(i,1);
    System.Text.RegularExpressions.Regex r = new System.Text.RegularExpressions.Regex(string.Join("\\s*",tmp));

    // on each text to filter, do this:
    string inp = "A text with the exa  mple word in it.";
    string outp;
    outp = r.Replace(inp,"");
    System.Console.WriteLine(outp);

Для краткости опущено экранирование специальных символов регулярных выражений.

1 голос
/ 23 апреля 2020

Вы можете попробовать регулярные выражения :

using System.Text.RegularExpressions;

....

// Having a word to find
string toFind = "Example";

// we build the regular expression
Regex regex = new Regex(
   @"\b" + string.Join(@"\s*", toFind.Select(c => Regex.Escape(c.ToString()))) + @"\b", 
   RegexOptions.IgnoreCase);

// Then we apply regex built for the required text:
string text = "This is a piece of text for this **example**. And more (e  X amp    le)";

string result = regex.Replace(text, "");

Console.Write(result);

Результат:

This is a piece of text for this ****. And more ()

Редактировать: если Вы хотите игнорировать диакритические знаки , вам следует изменить регулярное выражение:

  string toFind = "Example";

  Regex regex = new Regex(@"\b" + string.Join(@"\s*", 
    toFind.Select(c => Regex.Escape(c.ToString()) + @"\p{Lm}*")), 
    RegexOptions.IgnoreCase); 

и Normalize текст перед соответствием:

  string text = "This is a piece of text for this **examplé**. And more (e  X amp    le)";

  string result = regex.Replace(text.Normalize(NormalizationForm.FormD), "");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...