JS:试图测试一个非常具体的模式

时间:2018-01-19 18:33:52

标签: javascript regex

我需要验证给定规格的字符串:

const string = 'd(iig(i)), d(iitm), d' // is valid

主要是字符串表示d的一个或多个块,可以没有括号或空括号。 每个块由逗号和可选空格分隔。

在这个区块内部可以有g,i,t或m。只有g可以选择打开新的支架。

我从这个正则表达式开始:

if (!/^[dgitm, ()]*$/.test(string)) {
  throw Error('Pattern has invalid character')
}

但我不知道如何对待这些规范:

  1. 每个块必须用逗号分隔(带空格的optinal)
  2. 只允许空格(可选)在d-blocks
  3. 之间
  4. d和g可以有以下括号; i,t和m不应该有以下括号
  5. d永远不在任何括号内
  6. 有效

    dd(ii)
    d(i),d(g)
    d(g(iig))
    d(g(iig(i)))
    

    无效

    d(g(d))    // no nested d
    d(x)       // invalid character
    d(i())     // no brackets for i (only d or g)
    d(ii)d(ii) // missing comma
    i          // missing first level d
    

    更新

    删除了平衡括号的规范,因为regEx无法对此进行测试。

1 个答案:

答案 0 :(得分:2)

^d+(\((g\(|[git](?!\()|\))+)*(,d+(\((g\(|[git](?!\()|\))+)*)*$

可以对其进行测试here

<强>解释

^d+                                 The input must start with some 'd's (m>=1 times)

// First parenthesis' content:
(\((g\(|[git](?!\()|\))+)*          The following can appear n>=0 times:
                                    '(', then the following can appear p>=1 times:
                                        'g', then one of the following:
                                            - 'g('
                                            - ')'
                                            - 'g'/'i'/'t' - without a '(' after them
                                              (using negative lookahead)

// Every other element (optional):
(,d+(\((g\(|[git](?!\()|\))+)*)*    Starts with a ',d', ',dd' or ',ddd', etc.
                                    then the same as the first parenthesis' content

正如我在评论中提到的,您无法使用正则表达式验证括号。但是可以为此实现现有算法,或者通过比较开括号和右括号(显然应该相等)来获得初始验证感。

编辑:谢谢@anubhava的更正