正则表达式列出了所有可能

时间:2009-11-03 14:08:19

标签: regex

给定正则表达式,如何列出所有可能的匹配? 例如:AB [CD] 1234,我希望它返回如下列表: ABC1234 ABD1234

我在网上搜索,但找不到任何东西。

9 个答案:

答案 0 :(得分:7)

你没有找到任何东西的原因可能是因为考虑到某些表达式允许的组合数量,这是一个严重复杂的问题。一些正则表达式甚至可以允许infite匹配:

考虑以下表达式:

AB[A-Z0-9]{1,10}1234

AB.*1234

我认为你最好的选择是根据一小部分允许的模式自己创建一个算法。在您的具体情况下,我建议使用比正则表达式更天真的方法。

答案 1 :(得分:6)

Exrex可以做到这一点:

<section id="wrapper">
  <div id="content-wrap">
  
    <h1>
      Heading Heading Heading
    </h1>
    <p>
      Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has
      survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop
      publishing software like Aldus PageMaker including versions of Lorem Ipsum.
    </p>

  </div>
</section>

答案 2 :(得分:3)

对于一些简单的正则表达式,如您提供的(AB [CD] 1234),有一组有限的匹配。但对于其他表达式(AB [CD] * 1234),可能的匹配数量不受限制。

定位所有可能性的一种方法是检测正则表达式中的选择位置。对于每个可能的选择,基于原始正则表达式和当前选择生成新的正则表达式。这个新的正则表达式现在比原始表达式简单一些。

对于像“A [BC] [DE] F”这样的表达式,该方法将如下进行

getAllMatches("A[BC][DE]F")
= getAllMatches("AB[DE]F") + getAllMatches("AC[DE]F")
= getAllMatches("ABDF") + getAllMatches("ABEF") 
   + getAllMatches("ACDF")+ getAllMatches("ACEF")
= "ABDF" + "ABEF" + "ACDF" + "ACEF"

答案 3 :(得分:3)

可以编写一个算法来执行此操作,但它仅适用于具有有限可能匹配集的正则表达式。您的正则表达式仅限于使用:

  • 可选:?
  • 人物:。 \ d \ D
  • 设置:如[1a-c]
  • 否定集:[^ 2-9d-z]
  • 轮换:|
  • 正面看法

所以你的正则表达式无法使用:

  • 中继器:* +
  • 文字模式:\ w \ W
  • 否定的外观
  • 一些零宽度断言:^ $

还有一些其他人(字边界,懒惰和贪婪量词)我还不确定。

对于算法本身,另一位用户发布了一个指向this answer的链接,该链接描述了如何创建它。

答案 4 :(得分:2)

您可以将正则表达式转换为等效的有限状态机(相对简单并且可以通过算法完成),然后递归地通过该fsm的每个可能路径,输出通过机器的后续路径。它对于每个输出来说既不是很难也不是计算机密集型(但通常会获得大量的输出)。但是你应该注意禁止有效的无限传球(比如.*)。这可以通过具有最大允许路径长度来完成,之后中止跟踪

答案 5 :(得分:1)

不可能。

真。

考虑前瞻断言。那么.*怎么样,你将如何生成与正则表达式匹配的所有可能的字符串?

答案 6 :(得分:1)

正则表达式只是为了匹配一个模式,正如所说,正则表达式永远不会“列出”任何东西,只匹配。如果你想得到所有比赛的清单,我相信你需要自己做。

答案 7 :(得分:0)

有可能找到一些代码来列出所有可能的匹配,就像你正在做的那样简单。但大多数正则表达式甚至不想尝试列出所有可能的匹配。

例如AB。* 1234将是AB,然后是绝对任何东西,然后是1234。

答案 8 :(得分:0)

我并不完全确定这是可能的,但如果是这样的话,那么对于很多情况而言,这将是如此cpu /时间密集,它将没有用。

例如,尝试列出A. * Z

的所有匹配项

有些网站可以帮助建立一个好的正则表达式: