我有来自Golang的正则表达式(nameComponentRegexp)。如何将其转换为JavaScript样式的正则表达式?
对我来说主要阻塞问题:
optional
和repeated
match(`(?:[._]|__|[-]*)`)
复制,但它无法匹配单个句点或单个下划线。我是从在线正则表达式测试器上试过的。Golang的描述:
nameComponentRegexp限制注册表路径组件名称的启动 至少有一个字母或数字,以下部分可以 由一个句点分隔,一个或两个下划线和多个破折号。
alphaNumericRegexp = match(`[a-z0-9]+`)
separatorRegexp = match(`(?:[._]|__|[-]*)`)
nameComponentRegexp = expression(
alphaNumericRegexp,
optional(repeated(separatorRegexp, alphaNumericRegexp)))
一些有效的例子:
答案 0 :(得分:1)
了解如何构建nameComponentRegexp
:您从alphaNumericRegexp
开始,然后匹配1个或多个separatorRegexp
+ alphaNumericRegexp
的一个或多个序列。
optional()
执行以下操作:
// optional将表达式包装在非捕获组中并生成
//生产可选。
func optional(res ...*regexp.Regexp) *regexp.Regexp { return match(group(expression(res...)).String() + `?`) }
repeated()
这样做:
//重复将正则表达式包装在非捕获组中以获得一个或多个 //匹配。
func repeated(res ...*regexp.Regexp) *regexp.Regexp { return match(group(expression(res...)).String() + `+`) }
因此,您需要的是
/^[a-z0-9]+(?:(?:[._]|__|-*)[a-z0-9]+)*$/
请参阅regex demo
<强>详情:
^
- 字符串开头[a-z0-9]+
- 一个或多个字母数字符号(?:(?:[._]|__|-*)[a-z0-9]+)*
- 零个或多个序列:
(?:[._]|__|-*)
- .
,_
,__
或0+连字符[a-z0-9]+
- 一个或多个字母数字符号如果您想禁止使用aaaa
之类的字符串,则需要使用*
(demo)替换模式中的所有+
(2次出现)。
JS演示:
var ss = ['a.a','a_a','a__a','a-a','a--a','a---a'];
var rx = /^[a-z0-9]+(?:(?:[._]|__|-*)[a-z0-9]+)*$/;
for (var s of ss) {
console.log(s,"=>", rx.test(s));
}
&#13;