【问题标题】:Parsing a custom string-generating-pattern syntax解析自定义字符串生成模式语法
【发布时间】:2010-12-28 06:03:30
【问题描述】:

背景:我正在为 URL 文件名开发一种自定义的类似正则表达式的语法。它将像这样工作:

  • 用户编写一个模式,例如"[a-z][0-9]{0,2}",并将其作为输入传递
  • 它被程序解析并翻译成它所代表的排列集,即
    'a', 'a0', 'a00' ... 'z99'

这些模式的复杂性会有所不同,基本上任何可能出现在 URL 文件名中的内容都必须包含在内。语言是 Java 或 PHP,但任何语言的示例或抽象/概念帮助都非常受欢迎。

我的问题是:

  1. 从哪里开始实现上述的“解析器”

更不重要的是,

  1. 如何以编程方式将已解析的复杂模式转换为字符串

【问题讨论】:

  • 你能详细说明为什么正则表达式不适合这个问题吗?
  • 这是一个非常有趣和困难的问题。这是一个 Ruby 测验的主题:rubyquiz.com/quiz143.html。我喜欢 Ruby 的一个特性,例如('a'..'zzzzz').each {|x| puts x} 打印大小为 1 到 5 的所有小写字母组合。
  • @GrayWizardx 您如何将正则表达式用于算法的排列部分?

标签: regex string syntax parsing parser-generator


【解决方案1】:

这里有一个很好的答案: SO: /generate-all-permutations-of-text-from-a-regex-pattern-in-c

问题的症结在于...明确您真正需要的内容,并找到一种在您拥有所需内容后停止的方法,并尽可能缩小搜索范围,因为您正在与一个快速爆炸的数字调情的排列。 “必须容纳可能出现在 URL 文件名中的任何内容。”不会削减它。例如,如果您限制自己使用英文字符和数字,那么对于 6 个字符长的字符串,您将看到超过 20 亿个组合。每增加一个字符乘以 36。
如果您使用 ISO 8859,您将获得超过 274 万亿个组合,而 Unicode 则获得超过 745 万亿个组合。

【讨论】:

  • 感谢您的回答,并为迟到 4 年才接受它而道歉。至于排列数量的爆炸式增长,由用户定义要生成的字符集,从而控制排列集的大小。这个想法是构建一个大型的 URL“语料库”,并计算任何给定字符出现在其中某处/任何位置的概率,并从那里开始工作,也许有一个概率阈值,低于该值的字符不包含在排列中。这是一个我还没有完成的宠物项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 2020-11-15
  • 1970-01-01
  • 2022-10-16
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多