РЕДАКТИРОВАТЬ: вот обновленное решение, касающееся точек в вашем недавнем обновлении. Идея та же, за исключением того, что если у вас есть одна подстрока, она должна будет вставить шаблон игнорирования между каждым символом. Если подстрока содержит пробелы, она разделяется на пробелы и вставляет шаблон игнорирования между этими словами. Если вам не нужна последняя функциональность (которая больше соответствовала вашему первоначальному вопросу), тогда вы можете удалить проверку Split
и if
, которая предоставляет этот шаблон.
Обратите внимание, что этот подход не будет наиболее эффективным.
string input = @"foo ?A&3/3/C)412& bar A341C2";
string substring = "A41";
string[] ignoredChars = { "&", "/", "3", "C", ")" };
// builds up the ignored pattern and ensures a dash char is placed at the end to avoid unintended ranges
string ignoredPattern = String.Concat("[",
String.Join("", ignoredChars.Where(c => c != "-")
.Select(c => Regex.Escape(c)).ToArray()),
(ignoredChars.Contains("-") ? "-" : ""),
"]*?");
string[] substrings = substring.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
string pattern = "";
if (substrings.Length > 1)
{
pattern = String.Join(ignoredPattern, substrings);
}
else
{
pattern = String.Join(ignoredPattern, substring.Select(c => c.ToString()).ToArray());
}
foreach (Match match in Regex.Matches(input, pattern))
{
Console.WriteLine("Index: {0} -- Match: {1}", match.Index, match.Value);
}
Попробуйте это решение:
string input = "Hello, -this- is a string";
string[] searchStrings = { "Hello", "this" };
string pattern = String.Join(@"\W+", searchStrings);
foreach (Match match in Regex.Matches(input, pattern))
{
Console.WriteLine(match.Value);
}
\W+
будет соответствовать любому не алфавитно-цифровому символу. Если вам нужно указать их самостоятельно, вы можете заменить его классом символов, которые нужно игнорировать, например [ ,.-]+
(всегда ставьте символ тире в начале или конце, чтобы избежать непреднамеренных спецификаций диапазона). Также, если вам нужно игнорировать регистр, используйте RegexOptions.IgnoreCase
:
Regex.Matches(input, pattern, RegexOptions.IgnoreCase)
Если ваша подстрока находится в виде полной строки, такой как «Hello this», вы можете легко получить ее в виде массива для searchString
следующим образом:
string[] searchString = substring.Split(new[] { ' ' },
StringSplitOptions.RemoveEmptyEntries);