如何把字符串“1.B2.C3.A4.B5.A6.C7.AC8.BC9.AC10.BD11.(1)810 N (2)5 m/s 12.5倍” 转化成
1.B
2.C
3.A
4.B
5.A
6.C
7.AC
8.BC
9.AC
10.BD
11.(1)810 N (2)5 m/s 12.5倍
即以“数字.”分割字符串C#
1.B
2.C
3.A
4.B
5.A
6.C
7.AC
8.BC
9.AC
10.BD
11.(1)810 N (2)5 m/s 12.5倍
即以“数字.”分割字符串C#
规则统一的话,用linq 或正则都行
...
11.(1)810 N (2)5 m/s
12.5倍
1.把字符串转换成char数组(c#中的char表示一个unicode字符,所以包括了中文和全角字符)
2.定义两个游标start和end
3.为了便于解析文本,把游标初始定位到数组末尾,反向解析文本
4.这里有几个判断
a.如果当前字符为中文或者不为半角的'.',则移动游标start,递减
b.如果当前字符为半角的'.'则取start到end子字符串存储到一个栈中,置end=start重新定位末尾游标
5.重复执行步骤4直到start为0,这是全部子字符串已经存储到栈中了
6.可以对栈进行Pop操作,输出所有的子字符串则得到结果
class Program
{
static void Main(string[] args)
{
//需要解析的文本
string txt = "1.B2.C3.A4.B5.A6.C7.AC8.BC9.AC10.BD11.(1)810 N (2)5 m/s 12.5倍";
//把文本转换成字符数组
char[] c = txt.ToCharArray();
//定义一个栈存放子字符串
Stack<string> words = new Stack<string>();
//定义游标
int start = c.Length - 1;
int end = start;
//解析文本
while (start > 0)
{
if (IsWord(c[start])) start--;
if (c[start] == '.')
{
while (start-- > 0)
{
if ((c[start] < '0' || c[start] > '9'))
break; }
words.Push(txt.Substring(start + 1, end - start));
end = start;
}
start--;
}
//输出结果
while (words.Count > 0)
{
Console.WriteLine(words.Pop());
} Console.ReadLine();
}
//判断是否是中文字符
static bool IsWord(char code)
{
return Encoding.Default.GetByteCount(code.ToString()) == 1 ? false : true;
}
}
效果为:
希望对你有帮助!!
此时找到了'.'还需要解析答案的数字编码,所以要判断start--是否一直是数字,否则已经找完一个选择了!!
所以就有了以下的算法while (start-- > 0)
{
if ((c[start] < '0' || c[start] > '9')) break;
}
class Program
{
static void Main(string[] args)
{
//需要解析的文本
string txt = "1.B2.C3.A4.B5.A6.C7.AC8.BC9.AC10.BD11.(1)810 N (2)5 m/s 12.5倍";
//把文本转换成字符数组
char[] c = txt.ToCharArray();
//定义一个栈存放子字符串
Stack<string> words = new Stack<string>();
//定义游标
int start = c.Length - 1;
int end = start;
//解析文本
while (start > 0)
{
if (c[start] == '.')
{
while (start-- > 0)
{
if ((c[start] < '0' || c[start] > '9'))
break;
}
words.Push(txt.Substring(start + 1, end - start));
end = start;
}
start--;
}
//输出结果
while (words.Count > 0)
{
Console.WriteLine(words.Pop());
}
Console.ReadLine();
}
}
优化了下,去掉IsWord判断,没必要的
楼主这样能解决你的问题了吗?
var ary = Regex.Matches(str, @"\d+[..].*?(?=\d+[..]|$)").OfType<Match>().Select(t => t.Value).ToArray();