0

这是示例行,

(((EXAMPLE_WORD1 - EXAMPLE_WORD2)/EXAMPLE_WORD2) * 100)

我想分割上面的线,如下所示,

(
(
(
EXAMPLE_WORD1
-
EXAMPLE_WORD2
)
/
EXAMPLE_WORD2
)
*
100
)

如何在 C# 代码中完成上述任务?

4

5 回答 5

3

你可以这样做:

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);

这些解决方案是想法,我没有检查这些解决方案。编辑它们以获得更好的结果。

于 2012-12-24T10:06:12.330 回答
1

这似乎有效:

var regex = new Regex(@"(?=(\b|[^a-zA-Z_0-9])+)");
var split = regex.Split("(((EXAMPLE_WORD1 - EXAMPLE_WORD2)/EXAMPLE_WORD2) * 100)");

编辑:现在工作:)

于 2012-12-24T10:18:14.817 回答
1

如果您想要的是基于多个规则的通用分词器,那么这不是一项简单的任务。首先,您需要定义什么是适合您的。喜欢:

  • 单词是一系列字母(a-zA-Z),带有可接受的分隔符('_')
  • 单词是符号 ('(',')','-', '*')
  • word 是一系列带有/不带可接受分隔符的数字(',','.' - 基于文化)

等等

只有在你定义了应该被视为单词的严格规则之后,你才应该开始编码。如果是这种情况,您可以根据任务的复杂性
阅读有限自动机或类似的内容。

编辑:如果提供了您需要的所有模式,那么 Bert Evans 提供的链接就是您的解决方案的答案,即 Regex 模式:

string youString = @"(((EXAMPLE_WORD1 - EXAMPLE_WORD2)/EXAMPLE_WORD2) * 100)";
string[] parts = Regex.Split(yourString, @"(?<=[()-/*])");
于 2012-12-24T10:18:38.703 回答
0

我扩展了 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());
    }
于 2012-12-24T10:28:27.880 回答
0

虽然正则表达式会让您到达那里,但您可能需要考虑指定某种标记器以实现灵活性和/或可扩展性:

这是一个天真的例子:

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);
}
于 2012-12-24T10:55:46.530 回答