Как разбить строку, игнорируя регистр? - PullRequest
25 голосов
/ 17 сентября 2009

Мне нужно разделить строку, скажем, «asdf aA asdfget aa uoiu AA», используя «aa», игнорируя регистр до

"asdf "
"asdfget "
"uoiu "

Ответы [ 7 ]

60 голосов
/ 17 сентября 2009

Нет простого способа сделать это, используя string.Split. (Ну, за исключением указания всех перестановок строки разделения для каждого символа в нижнем / верхнем регистре в массиве - не очень элегантно, я думаю, вы согласитесь.)

Тем не менее, Regex.Split должны хорошо выполнять свою работу.

Пример:

var parts = Regex.Split(input, "aa", RegexOptions.IgnoreCase);
5 голосов
/ 17 сентября 2009

Если вас не волнует регистр, то самое простое, что нужно сделать, это перевести строку в верхний или нижний регистр перед использованием split.

stringbits = datastring.ToLower().Split("aa")

Если вас интересует регистр для интересных битов строки, но не для разделителей, тогда я бы использовал String.Replace, чтобы принудительно установить все разделители в конкретный случай (верхний или нижний, не имеет значения), а затем вызвать String. Разделить, используя соответствующий регистр для разделителя.

strinbits = datastring.Replace("aA", "aa").Replace("AA", "aa").Split("aa")
5 голосов
/ 17 сентября 2009

В вашем алгоритме вы можете использовать метод String.IndexOf и передать OrdinalIgnoreCase в качестве параметра StringComparison.

4 голосов
/ 17 сентября 2009

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

using System.Text.RegularExpressions;

string data = "asdf aA asdfget aa uoiu AA";
string aaRegex = "(.+?)[aA]{2}";

MatchCollection mc = Regex.Matches(data, aaRegex);

foreach(Match m in mc)
{
    Console.WriteLine(m.Value);
}
2 голосов
/ 17 сентября 2009

Это не самая красивая версия, но также работает:

"asdf aA asdfget aa uoiu AA".Split(new[] { "aa", "AA", "aA", "Aa" }, StringSplitOptions.RemoveEmptyEntries);
1 голос
/ 14 января 2015
    public static List<string> _Split(this string input,string[] splt)
    {
        List<string> _Result=new List<string>();
        foreach(string _splt in splt)
        {
            if (splt.Count() == 1)
            { 
                _Result.AddRange(Regex.Split(input, _splt, RegexOptions.IgnoreCase).ToList());
            }
            else 
            {
                List<string> NewStr = Regex.Split(input, _splt, RegexOptions.IgnoreCase).ToList();
                foreach(string _NewStr in NewStr)
                {
                    List<string> NewSplt = splt.ToList();
                    NewSplt.Remove(_splt);
                    return _Split(_NewStr, NewSplt.ToArray());
                }
            } 
        }
        return _Result;
    } 

затем используйте эту функцию как ниже

public frmThematicConversation()
{
    InitializeComponent();
    string str = "a b c d e f g h a b c f a d c b f";
    string[] splt = { "a", "b" };
    List<string> _result = str._Split(splt);
}
0 голосов
/ 29 мая 2019
Dim arr As String() = Strings.Split("asdf aA asdfget aa uoiu AA", 
                                    "aa" ,, CompareMethod.Text)

CompareMethod.Text игнорирует регистр.

...