为了账号安全,请及时绑定邮箱和手机立即绑定

正则表达式匹配

/ 猿问

正则表达式匹配

拉丁的传说 2019-10-21 15:31:02

我想写一个正则表达式,匹配之间的任何内容


()

(())

(()())

((()))

()()()

等等



查看完整描述

3 回答

?
冉冉说

所有这些答案都声称您不能使用模式来匹配具有平衡嵌套嵌套括号的字符串,这是完全错误的。从病理学教科书的意义上,假装现代编程语言所匹配的模式仅限于“常规语言”是不切实际的。只要您允许反向引用,它们就不允许。这使现实世界中的模式比教科书版本具有更多的匹配性,使其更加实用。


匹配平衡差的最简单模式是\((?:[^()]*+|(?0))*\)。但是,您永远不要写那个,因为它太紧凑了,不容易阅读。您应该始终使用/x模式来编写它,以允许空格和注释。所以这样写:


m{

  \(              # literal open paren

     (?:          # begin alternation group

         [^()]*+  #  match nonparens possessively

       |          # or else

         (?0)     #  recursively match entire pattern

     )*           # repeat alternation group

  \)              # literal close paren

}x

要命名您的抽象,以及将其定义及其顺序与执行分离,还有很多话要说。这导致了这种事情:


my $nested_paren_rx = qr{


    (?&nested_parens)


    (?(DEFINE)


        (?<open>       \(       )

        (?<close>       \)      )

        (?<nonparens> [^()]     )


        (?<nested_parens>

            (?&open)

            (?:

                (?&nonparens) *+

              |

                (?&nested_parens)

            ) *

            (?&close)

        )


    )

}x;

现在,第二种形式可以包含在较大的样式中。


永远不要让任何人告诉您不能使用模式来匹配递归定义的内容。正如我刚刚演示的那样,您当然可以。


在进行此操作时,请确保不要编写线噪声模式。您不必,也不应该。禁止保留空格,注释,子例程或字母数字标识符的任何编程语言都无法维护。因此,请在模式中使用所有这些内容。


当然,为这种工作选择正确的语言确实有帮助。☺


查看完整回答
反对 回复 2019-10-21
?
慕容4345310

如果您被其正则表达式语法不支持递归匹配的语言所困扰,我为您提供了一个简单的Javascript实现,您应该可以使用该Javascript实现自己选择的语言:


function testBraces(s) {

    for (var i=0, j=0; i<s.length && j>=0; i++)

        switch(s.charAt(i)) {

            case '(': { j++ ; break; }

            case ')': { j-- ; break; }

        }


    return j == 0;

}

在这里,您可以使用它:http : //jsfiddle.net/BFsn2/


查看完整回答
反对 回复 2019-10-21
?
呼如林

这种嵌套结构不能通过正则表达式有效地处理。您需要的是语法和该语法的解析器。就您而言,语法足够简单。如果您使用的是python,请尝试pyparsing或funcparserlib。


使用pyparsing可以执行以下操作:


from pyparsing import nestedExpr

nestedExpr().parseString( "(some (string you) (want) (to) test)" ).asList()

这将返回一个包含嵌套字符串的已解析组件的列表。nestedExpr的默认定界符是括号,因此您无需执行任何其他操作。如果要使用funcpasrerlib,可以尝试以下操作


from funcparserlib.parser import forward_decl, many, a

bracketed = forward_decl()

bracketed.define(a('(') + many(bracketed) + a(')'))

之后,您可以致电


bracketed.parse( "( (some) ((test) (string) (you) (want)) (to test))" )

它将在一个元组中返回已解析的元素。


查看完整回答
反对 回复 2019-10-21

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信