【问题标题】:How Can I Extract and Split These Values?如何提取和拆分这些值?
【发布时间】:2011-11-04 05:36:12
【问题描述】:

这是我正在使用的字符串示例

{Hi|Hello|Holla} {James{ey|o|ing}|Bob{bie|bey}}

我需要一个正则表达式来提取 {} 示例之间的值:

Hi|Hello|Holla
James{ey|o|ing}
Bob{bie|bey}

原始字符串称为 Spintax。我的程序将选择一个包含在每个 {} 块中的随机值。嵌套的 {} 块可以很深。

正则表达式需要提取 {} 之间的值,忽略任何嵌套的 {} 块。然后,再次通过管道 (|) 拆分值,忽略任何嵌套的 {} 块,这样嵌套的 {} 块中的管道就不会被触及。

这有意义吗?

我确实使用 String 方法实现了部分解决方案,但是当通过管道拆分时,它也会拆分嵌套 {} 内的管道,这是意料之中的,但我想不出一种方法来忽略嵌套的 {}

public String spintaxParse(String s)
    {
        // TODO: Implement logic to check for {} within String.
        if (s.Contains('{'))
        {
            int firstOccuranceOfOpenBrace = s.IndexOf('{');

            while (s[firstOccuranceOfOpenBrace + 1].Equals('{'))
                firstOccuranceOfOpenBrace++;

            int firstOccuranceOfClosingBrace = s.Substring(firstOccuranceOfOpenBrace).IndexOf('}');

            String spintaxBlock = s.Substring(firstOccuranceOfOpenBrace, firstOccuranceOfClosingBrace + 1);

            String[] items = spintaxBlock.Substring(1, spintaxBlock.Length - 2).Split('|');

            Random rand = new Random();

            s = s.Replace(spintaxBlock, items[rand.Next(items.Length)]);

            return spintaxParse(s);
        }
        else
        {
            return s;
        }
    }

【问题讨论】:

  • 您可能希望在此问题中添加 [c#] 标签,因为它似乎基于your previous question。它还明确了您想要正则表达式的编程语言,因为不同的平台有不同的正则表达式实现。
  • 您的问题不一致。您想拆分所有级别 1 和级别 2 模式,而不是级别 3?
  • 同意政体。根据您的描述,此处的示例字符串应拆分为
    Hi
    Hello
    Holla
    James{ey|o|ing}
    Bob{bie|bey}
    是分隔符
  • 检查代码。它是一个递归函数,可找到第一组 {} 并将其替换为 {} 块中的随机值。然后将字符串传递给函数,并找到第二组,依此类推,直到全部被替换。我可以使用上面的解决方案提取 {} 中的值,但是当我通过管道分隔符拆分值时,如果字符串包含嵌套的 {},那么该块中的管道会被拆分,这是我不想要的.我想拆分级别 1..n
  • 谷歌 Spintax 来定义它是什么,你就会明白我的意思。

标签: c# regex spintax


【解决方案1】:

由于您正在处理多嵌套语法,我想您可能希望使用解析器生成工具创建一个简单的解析器,例如“ANTLR”。 ANTLR Link

ANTLR 语法应该是这样的:

statements: statement+
     ;
statement: '{'+ content + '}'
     ;
content: token
     | TOKEN + '|' + content
     | TOKEN + '|' + statement
     ;

TOKEN: \w+
     ;

【讨论】:

  • 我可能会使用正则表达式来表示“如果此管道分隔值字符串中有 {...} 块,则不要拆分该嵌套块中的值”。
【解决方案2】:

手动或使用一些解析器生成器可能更容易解析字符串。

对于匹配平衡大括号的正则表达式,请查看此答案 - Regular expression for String.Format-like utility 和相关的 MSDN 文章 http://msdn.microsoft.com/en-us/library/bs2twtah.aspx#balancing_group_definition

【讨论】:

    猜你喜欢
    • 2011-06-17
    • 2015-05-13
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 2017-04-20
    • 2013-05-31
    相关资源
    最近更新 更多