我有一个像
这样的字符串"List_1 fooo asdf List_2 bar fdsa XList_3 fooo bar"
和List<String>
之类的
List<String> l_lstValues = new List<string> { "List_1", "XList_3", "List_2" };
我需要根据l_lstValues
。
所以分裂的子串就像
List_1 fooo asdf
List_2 bar fdsa
XList_3 fooo bar
请给我一个方法来做到这一点 提前致谢
答案 0 :(得分:3)
你必须在msdn上使用这个split方法,你必须将List传递给一个数组,然后,你必须作为分割该数组的参数传递。
我在这里留下链接
http://msdn.microsoft.com/en-us/library/tabh47cf(v=VS.90).aspx
如果你想要保留你正在拆分的单词,你必须迭代结果数组,然后在列表中添加单词,如果你在字符串和列表中有相同的顺序。
如果订单未知,您可以使用indexOf找到列表中的单词并手动拆分字符串。
见到你
答案 1 :(得分:1)
您可以执行以下操作:
string sampleStr = "List_1 fooo asdf List_2 bar fdsa XList_3 fooo bar";
string[] splitStr =
sampleStr.Split(l_lstValues.ToArray(), StringSplitOptions.RemoveEmptyEntries);
编辑:已修改为使用列表字打印片段
假设::
sampleStr
”
foreach(string listWord in l_lstValues)
{
sampleStr = sampleStr.Replace(listWord, ':'+listWord);
}
string[] fragments = sampleStr.Split(':');
答案 2 :(得分:1)
这是最简单直接的解决方案:
public static string[] Split(string val, List<string> l_lstValues) {
var dic = new Dictionary<string, List<string>>();
string curKey = string.Empty;
foreach (string word in val.Split(' ')) {
if (l_lstValues.Contains(word)) {
curKey = word;
}
if (!dic.ContainsKey(curKey))
dic[curKey] = new List<string>();
dic[curKey].Add(word);
}
return dic.Values.ToArray();
}
该算法没有什么特别之处:它迭代所有传入的单词并跟踪“当前键”,用于将相应的值排序到字典中。
编辑:我简单地回答了原来的答案以更符合这个问题。它现在返回一个string []数组 - 就像String.Split()方法一样。如果传入字符串序列不是以l_lstValues列表中的键开头,则抛出异常。答案 3 :(得分:1)
您可以使用添加的控制字符替换原始字符串中列表的每个字符串,然后在该字符上拆分。例如,您的原始字符串:
List_1 fooo asdf List_2 bar fdsa XList_3 fooo bar
需要成为:
List_1 fooo asdf;List_2 bar fdsa;XList_3 fooo bar
稍后将根据;
进行拆分,从而产生所需的结果。为此,我使用此代码:
string ori = "List_1 fooo asdf List_2 bar fdsa XList_3 fooo bar"
foreach (string word in l_lstValues) {
ori = ori.Replace(word, ";" + word);
}
ori = ori.Replace(" ;", ";"); // remove spaces before ;
ori = Regex.Replace(ori, "^;", ""); // remove leading ;
return (ori.split(";"));
您还可以汇编以下正则表达式:
(\S)(\s?(List_1|XList_3|List_2))
第一个令牌(\S)
将阻止替换第一个匹配项,第二个令牌\s?
将删除该空格。现在我们使用它来添加;
:
string ori = "List_1 fooo asdf List_2 bar fdsa XList_3 fooo bar"
string regex = "(\S)(\s?(" + String.Join("|", l_lstValues) + "))";
ori = Regex.Replace(ori, regex, "$1;$3");
return (ori.split(";"));
正则表达式选项更危险,因为单词可以包含scape序列。
答案 4 :(得分:1)
您可以这样做:
string a = "List_1 fooo asdf List_2 bar fdsa XList_3 fooo bar";
List<String> l_lstValues = new List<string> { "List_1",
"XList_3", "List_2" };
var e = l_lstValues.GetEnumerator();
e.MoveNext();
while(e.MoveNext())
{
var p = a.IndexOf(e.Current);
a = a.Insert(p, "~");
}
var splitStrings = a.Split(new string[]{" ~"},StringSplitOptions.None);
所以在这里,每当我遇到列表中的元素时,我都会插入一个~
(除了第一个,因此是外部e.MoveNext()
),然后在~
上拆分(请注意前面的内容) space)最大的假设是你在字符串中没有~
,但我认为这个解决方案很简单,如果你能找到这样的字符并确保字符不会出现在原始字符串中。如果字符不适合您,请使用~~@@
之类的内容,因为我的解决方案显示字符串拆分为string[]
,您只需添加整个字符串即可进行拆分。
当然你可以这样做:
foreach (var sep in l_lstValues)
{
var p = a.IndexOf(sep);
a = a.Insert(p, "~");
}
但是会有一个空字符串,我只想使用MoveNext()
和Current
:)
答案 5 :(得分:0)
您可以使用String.IndexOf方法获取列表中每个词组的起始字符索引。
然后,您可以使用此索引拆分字符串。
string input = "A foo bar B abc def C opq rst";
List<string> lstValues = new List<string> { "A", "C", "B" };
List<int> indices = new List<int>();
foreach (string s in lstValues)
{
// find the index of each item
int idx = input.IndexOf(s);
// if found, add this index to list
if (idx >= 0)
indices.Add(idx);
}
获得所有索引后,对其进行排序:
indices.Sort();
然后,使用它们来获得结果字符串:
// obviously, if indices.Length is zero,
// you won't do anything
List<string> results = new List<string>();
if (indices.Count > 0)
{
// add the length of the string to indices
// as the "dummy" split position, because we
// want last split to go till the end
indices.Add(input.Length + 1);
// split string between each pair of indices
for (int i = 0; i < indices.Count-1; i++)
{
// get bounding indices
int idx = indices[i];
int nextIdx = indices[i+1];
// split the string
string partial = input.Substring(idx, nextIdx - idx).Trim();
// add to results
results.Add(partial);
}
}
答案 6 :(得分:0)
这是我制作的示例代码。如果您的键分割器从原始字符串的左侧到右侧顺序排列,这将获得您需要的子字符串。
var oStr ="List_1 fooo asdf List_2 bar fdsa XList_3 fooo bar";
List<String> l_lstValues = new List<string> { "List_1", "List_2", "XList_3" };
List<string> splitted = new List<string>();
for(int i = 0; i < l_lstValues.Count; i++)
{
var nextIndex = i + 1 >= l_lstValues.Count ? l_lstValues.Count - 1 : i + 1;
var length = (nextIndex == i ? oStr.Length : oStr.IndexOf(l_lstValues[nextIndex])) - oStr.IndexOf(l_lstValues[i]);
var sub = oStr.Substring(oStr.IndexOf(l_lstValues[i]), length);
splitted.Add(sub);
}
答案 7 :(得分:0)
您可以使用以下代码完成此任务
string str = "List_1 fooo asdf List_2 bar fdsa XList_3 fooo bar";
List<String> l_lstValues = new List<string> { "List_1", "XList_3", "List_2" };
string[] strarr = str.Split(' ');
string sKey, sValue;
bool bFlag = false;
sKey = sValue = string.Empty;
var lstResult = new List<KeyValuePair<string, string>>();
foreach (string strTempKeys in l_lstValues)
{
bFlag = false;
sKey = strTempKeys;
sValue = string.Empty;
foreach (string strTempValue in strarr)
{
if (bFlag)
{
if (strTempValue != sKey && l_lstValues.Contains(strTempValue))
{
bFlag = false;
break;
}
else
sValue += strTempValue;
}
else if (strTempValue == sKey)
bFlag = true;
}
lstResult.Add(new KeyValuePair<string, string>(sKey, sValue));
}