将Golang正则表达式转换为JS正则表达式

时间:2017-07-24 03:39:52

标签: javascript regex go

我有来自Golang的正则表达式(nameComponentRegexp)。如何将其转换为JavaScript样式的正则表达式?

对我来说主要阻塞问题:

  1. 如何正确使用JavaScript中的optionalrepeated
  2. 我尝试从match(`(?:[._]|__|[-]*)`)复制,但它无法匹配单个句点或单个下划线。我是从在线正则表达式测试器上试过的。
  3. Golang的描述:

      

    nameComponentRegexp限制注册表路径组件名称的启动       至少有一个字母或数字,以下部分可以       由一个句点分隔,一个或两个下划线和多个破折号。

    alphaNumericRegexp = match(`[a-z0-9]+`)
    separatorRegexp = match(`(?:[._]|__|[-]*)`)
    
    nameComponentRegexp = expression(
        alphaNumericRegexp,
        optional(repeated(separatorRegexp, alphaNumericRegexp)))
    

    一些有效的例子:

    • A.A
    • A_A
    • a__a
    • 的a-a
    • A - A
    • 一个---一个

1 个答案:

答案 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演示:

&#13;
&#13;
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;
&#13;
&#13;