我需要拆分一个字符串,让我们说“asdf aA asdfget aa uoiu AA”拆分使用“aa”忽略这个案例。 到
"asdf "
"asdfget "
"uoiu "
答案 0 :(得分:60)
使用string.Split
实现此目的并不容易。 (好吧,除了为数组中的每个字符小写/大写字母指定拆分字符串的所有排列 - 不是很优雅我认为你会同意。)
然而,Regex.Split
应该很好地完成这项工作。
示例:
var parts = Regex.Split(input, "aa", RegexOptions.IgnoreCase);
答案 1 :(得分:5)
在算法中,您可以使用String.IndexOf方法并将OrdinalIgnoreCase作为StringComparison参数传递。
答案 2 :(得分:5)
如果您不关心大小写,那么最简单的方法是在使用split之前将字符串强制为大写或小写。
stringbits = datastring.ToLower().Split("aa")
如果您关心字符串的有趣位而不是分隔符的情况,那么我将使用String.Replace强制所有分隔符到特定的大小写(大写或小写,无关紧要),然后调用String。使用匹配大小写分割为分隔符。
strinbits = datastring.Replace("aA", "aa").Replace("AA", "aa").Split("aa")
答案 3 :(得分:4)
我的答案不如Noldorin's那么好,但我会留下它让人们可以看到替代方法。这对于简单的拆分不太好,但如果你需要进行更复杂的解析,它会更灵活。
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);
}
答案 4 :(得分:2)
这不是pretties版本,但也有效:
"asdf aA asdfget aa uoiu AA".Split(new[] { "aa", "AA", "aA", "Aa" }, StringSplitOptions.RemoveEmptyEntries);
答案 5 :(得分:1)
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);
}
答案 6 :(得分:0)
Dim arr As String() = Strings.Split("asdf aA asdfget aa uoiu AA",
"aa" ,, CompareMethod.Text)
CompareMethod.Text
忽略大小写。
答案 7 :(得分:0)
基于@Noldorin的答案,我做了这种扩展方法。
它接受多个分隔符字符串,并且如果您提供多个分隔符字符串,则模仿string.Split(..)
的行为。它具有不变的(“非特定文化”)文化,并且会忽略某些情况。
/// <summary>
/// <see cref="string.Split(char[])"/> has no option to ignore casing.
/// This functions mimics <see cref="string.Split(char[])"/> but also ignores casing.
/// When called with <see cref="StringSplitOptions.RemoveEmptyEntries"/> <see cref="string.IsNullOrWhiteSpace(string)"/> is used to filter 'empty' entries.
/// </summary>
/// <param name="input">String to split</param>
/// <param name="separators">Array of separators</param>
/// <param name="options">Additional options</param>
/// <returns></returns>
public static IEnumerable<string> SplitInvariantIgnoreCase(this string input, string[] separators, StringSplitOptions options)
{
if (separators == null) throw new ArgumentNullException(nameof(separators));
if (separators.Length <= 0) throw new ArgumentException("Value cannot be an empty collection.", nameof(separators));
if (string.IsNullOrWhiteSpace(input)) throw new ArgumentException("Value cannot be null or whitespace.", nameof(input));
// Build a regex pattern of all the separators this looks like aa|bb|cc
// The Pipe character '|' means alternative.
var regexPattern = string.Join("|", separators);
var regexSplitResult = Regex.Split(input, regexPattern, RegexOptions.IgnoreCase | RegexOptions.CultureInvariant);
// NOTE To be honest - i don't know the exact behaviour of Regex.Split when it comes to empty entries.
// Therefore i doubt that filtering null values even matters - however for consistency i decided to code it in anyways.
return options.HasFlag(StringSplitOptions.RemoveEmptyEntries) ?
regexSplitResult.Where(c => !string.IsNullOrWhiteSpace(c))
: regexSplitResult;
}
答案 8 :(得分:0)
我编写的这个使用 .replace()
来查找和修复外壳的扩展方法取得了很好的成功。
你这样称呼它:
var result = source.Split(prefix, StringComparison.InvariantCultureIgnoreCase);
扩展方法定义如下。
public static string[] Split(this string source, string separator,
StringComparison comparison = StringComparison.CurrentCulture,
StringSplitOptions splitOptions = StringSplitOptions.None)
{
if (source is null || separator is null)
return null;
// Pass-through the default case.
if (comparison == StringComparison.CurrentCulture)
return source.Split(new string[] { separator }, splitOptions);
// Use Replace to deal with the non-default comparison options.
return source
.Replace(separator, separator, comparison)
.Split(new string[] { separator }, splitOptions);
}
注意:此方法处理我通常传递单个字符串分隔符的默认情况。