我有一个类似WideCharToMultiByte
的字符串输入。
我想知道是否有一种在C#和LINQ中使用var input = "AB-PQ-EF=CD-IJ=XY-JK"
方法的方法,这样我就可以得到看起来像string.split()
的字符串数组。目前,我正在通过迭代输入字符串来手动进行相同的转换。
答案 0 :(得分:7)
可以使用正则表达式代替split吗?
var input = "AB-PQ-EF=CD-IJ=XY-JK";
var pattern = new Regex(@"(?<![A-Z])(?=([A-Z]+[=-][A-Z]+))");
var output = pattern.Matches(input).Cast<Match>().Select(m => m.Groups[1].Value).ToArray();
答案 1 :(得分:0)
这是一个有效的脚本。如果您有一个固定的固定定界符,则只需查看一次对Regex.split
的调用。您原始的字符串没有具有该字符串,但是我们可以轻松地在该输入中进行一些重复,以使该字符串变得可拆分。
string input = "ABC-PQ-EF=CD-IJ=XYZ-JK";
string s = Regex.Replace(input, @"((?<=[=-])[A-Z]+(?=[=-]))", "$1~$1");
Console.WriteLine(s);
var items = Regex.Split(s, @"(?<=[A-Z]{2}[=-][A-Z]{2})[~]");
foreach (var item in items)
{
Console.WriteLine(item);
}
ABC-PQ~PQ-EF~EF=CD~CD-IJ~IJ=XYZ~XYZ-JK
ABC-PQ
PQ-EF
EF=CD
CD-IJ
IJ=XYZ
XYZ-JK
如果您仔细查看上面输出的第一行,将会看到我使用的技巧。我只是通过不同的定界符连接了所需的对(理想情况下,~
不会出现在字符串的任何其他位置)。然后,我们只需要用该分隔符分开即可。
答案 2 :(得分:0)
对于使用string.Split和LINQ的解决方案,我们只需要跟踪行进的每个部分的长度,以便可以从原始字符串中拉出分隔符,如下所示:
var input = "ABC-PQ-EF=CDED-IJ=XY-JKLM";
var split = input.Split('-', '=');
int offset = 0;
var result = split
.Take(split.Length - 1)
.Select((part, index) => {
offset += part.Length;
return $"{part}{input[index + offset]}{split[index + 1]}";})
.ToArray();
答案 3 :(得分:0)
您可以尝试以下方法:
这里我们将根据特殊字符分割字符串,然后循环遍历元素并选择直到下一个字符组。
例如:获取AB
并获取直到PQ
的值
string valentry = "AB-PQ-EF=CD-IJ=XY-JK";
List<string> filt = Regex.Split(valent, @"[\-|\=]").ToList();
var listEle = new List<string>();
fil.ForEach(x =>
{
if (valentry .IndexOf(x) != valentry .Length - 2)
{
string ele = valentry.Substring(valentry .IndexOf(x), 5);
if (!String.IsNullOrEmpty(ele))
listEle.Add(ele);
}
});
答案 4 :(得分:0)
您能适应这样的事情吗?只需更改因子分解。
List<string> lsOut = new List<string>() { };
string sInput = "AB-PQ-EF=CD-IJ=XY-JK";
string sTemp = "";
for (int i = 0; i < sInput.Length; i++)
{
if ( (i + 1) % 6 == 0)
{
continue;
}
// add to temp
sTemp += sInput[i];
// multiple of 5, add all the temp to list
if ( (i + 1 - lsOut.Count) % 5 == 0)
{
lsOut.Add(sTemp);
sTemp = "";
}
if(sInput.Length == i + 1)
{
lsOut.Add(sTemp);
}
}
答案 5 :(得分:0)
string input = "AB-PQ-EF=CD-IJ=XY-JK";
var result = new Regex(@"(?<![A-Z])(?=([A-Z]+[=-][A-Z]+))").Matches(input)
.Cast<Match>().Select(m => m.Groups[1].Value).ToArray();
foreach (var item in result)
{
Console.WriteLine(item);
}
答案 6 :(得分:0)
最近正在学习Haskell,因此这是一个递归解决方案。
static IEnumerable<string> SplitByPair(string input, char[] delimiter)
{
var sep1 = input.IndexOfAny(delimiter);
if (sep1 == -1)
{
yield break;
}
var sep2 = input.IndexOfAny(delimiter, sep1 + 1);
if (sep2 == -1)
{
yield return input;
}
else
{
yield return input.Substring(0, sep2);
foreach (var other in SplitByPair(input.Substring(sep1 + 1), delimiter))
{
yield return other;
}
}
}
好东西是