【问题标题】:Regular Expression for an infinite string无限字符串的正则表达式
【发布时间】:2015-11-26 00:54:21
【问题描述】:

我试图弄清楚你是否可以为无限字符串的子字符串集提供正则表达式,例如,如果无限字符串是 123123123123123123...

会有一个描述这个的正则表达式吗? 例如我试过 (123)|(231)|(312)* 但这行不通,因为我需要考虑字符串中的 12 和 23

【问题讨论】:

  • 你想匹配那个无限字符串的所有子字符串?
  • 条件一定要多,否则就是(?=(\d{3}))
  • (123)+ - regexr.com/3c9i3

标签: regex regular-language


【解决方案1】:

将“无限”字符串定义为相同基本字符串<base>(在您的示例中为123)的无限数量副本的串联。首先观察任何子字符串都具有以给定顺序出现的以下部分:

  1. <base> 的后缀或空字符串
  2. <base> 0 次或多次重复
  3. <base> 的前缀或空字符串

用正则表达式翻译成

  1. 所有<base> 后缀的可选替换
  2. Kleene 运算符应用于<base>
  3. 所有<base> 前缀的可选替换

具体来说:

(23|3)?(123)*(1|12)?

此解决方案明确允许空子字符串。为了排除这种情况,前缀或后缀或中间部分不能为空。这可以通过完整模式的不同变化的交替来实现。

123|((23|3)(123)*(1|12)?)|((23|3)?(123)*(1|12))

【讨论】:

    【解决方案2】:

    我认为this is the closest you're going to get with 正在验证“模式”。否则,如果您需要更多的可变性,您将需要(至少)借助您选择的编程语言进行中间层处理。

    ^(?<detectPattern>
      123
      |132
      |213
      |231
      |312
      |321
    )\k<detectPattern>*$
    

    该模式是在末尾使用引用来编写的,以直观地解释它在开头是如何匹配的。否则,您可以轻松删除\k&lt;detectPattern&gt;,但保留*

    【讨论】:

    • 您的模式似乎有缺陷。首先,由于锚点,它不会与无限字符串匹配。其次,丢弃锚点,它只会识别长度为3 * n; n=1, 2,... 的字符串。更糟糕的是,它不匹配 substrings 但 subsequences (例如,132 在 OP 的示例字符串中没有作为子字符串出现)。最后,它没有识别 all 子序列(但是,如果那是 OP 的要求,那么解决方案就是 [123]+)。
    • @collaspar 他的例子是一行。添加132 只是为说明实现最终结果的方法而给出的数字的另一种组合。
    • @collaspar 此外,对于如何应用正则表达式,无限应该是一个相对术语。正则表达式需要某种形式的有限结束才能成功验证所述模式。否则,由于处理/周期过多,您扔给它的任何东西最终都会失败。 “我认为”并不是说我的解决方案是 100%。这是我认为最接近(实用)的方法,可以在开始时获得某种形式的检测并验证字符串的其余部分。
    • 关于正则表达式的主要观点是能够简洁地表示(某一类)无限字符串。这是一个有用的抽象,它不会被物理资源的有限性所抵消(人们将讨论算法的渐近复杂性,尽管在物理世界中一切都归结为O(1)),想想连续流处理。此外(据我了解),OP 要求使用正则表达式来描述可能的子字符串集,这与检测无限字符串前缀的开始的正则表达式不同,并且具有不同的用例。
    • 我承认这一点,考虑到我编写上述正则表达式所花费的时间比它证明我的方法的合理性要少。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多