我需要验证给定规格的字符串:
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')
}
但我不知道如何对待这些规范:
有效
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无法对此进行测试。
答案 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的更正