【问题标题】:Match empty string, comma, hyphen or underscore once using regex使用正则表达式匹配一次空字符串、逗号、连字符或下划线
【发布时间】:2015-10-04 10:12:37
【问题描述】:

我正在尝试找出如何匹配以下字符串:

blaOSXbla
os X bla
bla os-x
blablaOS_Xbla

一个常见的模式很简单:/(osx|os x|os-x|os_x)/i.test(string)

任务是尽可能减少它。所以我的下一步是 /(os)x| x|-x|_x)/i.test(string).

我也尝试过/os(.*?)x/ 模式,但它匹配osx 之间的任意数量的符号。如何使它匹配零个或一个符号

【问题讨论】:

    标签: javascript html regex match


    【解决方案1】:

    您需要使用character class:

    /os[ _-]?x/i
    

    demo

    使用“字符类”,也称为“字符集”,您可以告诉正则表达式引擎只匹配几个字符中的一个。只需将要匹配的字符放在方括号之间。如果要匹配ae,请使用[ae]

    一个字符类只匹配一个字符。 gr[ae]y 不匹配 graaygraey 或任何类似的东西。字符类中字符的顺序无关紧要。结果是一样的。

    您需要? 才能使匹配成为可选。

    "Optional Items":

    问号使正则表达式中的前面的标记成为可选的。 colou?r 匹配 colourcolor。问号称为量词。

    【讨论】:

    • 我相信-应该被转义
    • @ben 不是在结尾时
    • @ben:不,因为它位于字符类的末尾。在某些来源中,这被称为“智能放置”。几乎所有正则表达式引擎风格都支持它。虽然,在 ElasticSearch 中,连字符应位于字符范围的开头,以免对其进行转义。
    【解决方案2】:

    试试:

    /os[ \-_]?x)/i.test(string)
    

    使用? 匹配之前设置的零次或一次。

    Demo

    【讨论】:

    • 为什么要使用转义字符?它不在 regexp 函数中,因此可能会被省略。
    • @Shaels 在某些浏览器中,它被视为range 选择器,stackoverflow.com/questions/31284144/…。所以,最好有,而不是错误
    • @Shaels:如果字符类中的连字符不在开始和结束位置,并且可以形成范围,则应转义。另请注意,如果放在速记类之后,- 也将被视为文字(如[\d-_])。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-28
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    相关资源
    最近更新 更多