从一行一个字一个字地分割
本文关键字:一个 分割 一行 | 更新日期: 2023-09-27 17:49:19
下面是示例行,
(((EXAMPLE_WORD1 - EXAMPLE_WORD2)/EXAMPLE_WORD2) * 100)
我想像下面那样分割上面的行,
(
(
(
EXAMPLE_WORD1
-
EXAMPLE_WORD2
)
/
EXAMPLE_WORD2
)
*
100
)
如何在c#代码中完成上述任务?
你可以这样做:
string str= "(((EXAMPLE_WORD1 - EXAMPLE_WORD2)/EXAMPLE_WORD2) * 100)";
string[] arr = str.Split(new char[]{'/','*','(',')'},SplitOption.RemoveEmpty);
UPDATE1:在以前的解决方案中,分隔符将从arr中删除。也许更好的解决方案在这里:
string str= "(((EXAMPLE_WORD1 - EXAMPLE_WORD2)/EXAMPLE_WORD2) * 100)";
str = str.replace("(","#(#").replace("/","#/#").replace(")","#)#").replace("*","#*#");
string[] arr = str.Split(new char[]{'#'},SplitOption.RemoveEmpty);
这些解决方案是想法,我没有检查这些解决方案。编辑它们以获得更好的效果。
这似乎可以工作:
var regex = new Regex(@"(?=('b|[^a-zA-Z_0-9])+)");
var split = regex.Split("(((EXAMPLE_WORD1 - EXAMPLE_WORD2)/EXAMPLE_WORD2) * 100)");
编辑:现在有效了:)
如果您想要的是基于几个规则的通用分词器,那么它不是一个微不足道的任务。首先,需要为您定义什么是word。如:
- 单词是一系列字母(a-zA-Z),带有可接受的分隔符('_')
- 字是符号('(',')','-','*')
- 字是一组带/不带可接受分隔符(',',')的数字。' -基于培养)
等等
只有在定义了严格的规则之后,才可以开始编码。
如果是这种情况,你可以根据你的任务的复杂性阅读有限自动机或类似的东西。
EDIT:如果提供的模式所有你需要那么Bert Evans提供的链接是你的解决方案的答案,即Regex模式:
string youString = @"(((EXAMPLE_WORD1 - EXAMPLE_WORD2)/EXAMPLE_WORD2) * 100)";
string[] parts = Regex.Split(yourString, @"(?<=[()-/*])");
我扩展了Ali's Answer以得到确切的输出
(
(
(
EXAMPLE_WORD1
-
EXAMPLE_WORD2
)
/
EXAMPLE_WORD2
)
*
100
)
string str = "(((EXAMPLE_WORD1 - EXAMPLE_WORD2)/EXAMPLE_WORD2) * 100)";
str = str.Replace("(", "{(}");
str = str.Replace("*", "{*}");
str = str.Replace(")", "{)}");
str = str.Replace("/", "{/}");
str = str.Replace("-", "{-}");
string[] arr = str.Split(new char[] { '{', '}' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string strs in arr)
{
Console.WriteLine(strs.Trim());
}
虽然使用正则表达式可以实现此目的,但您可能需要考虑为灵活性和/或可伸缩性指定一种标记器:
这里有一个简单的例子:
static IEnumerable<string> Tokenize(string str)
{
var sb = new StringBuilder();
foreach (var c in str)
{
if(char.IsLetterOrDigit(c) || c == '_')
{
sb.Append(c);
}
else if (char.IsPunctuation(c))
{
if (sb.Length > 0)
{
yield return sb.ToString();
sb.Clear();
}
yield return c.ToString(CultureInfo.InvariantCulture);
}
}
if (sb.Length > 0) yield return sb.ToString();
}
static void Main(string[] args)
{
const string st = "(((EXAMPLE_WORD1 - EXAMPLE_WORD2)/EXAMPLE_WORD2) * 100)";
Tokenize(st).ToList().ForEach(Console.WriteLine);
}