gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:34:52 25 4
gpt4 key购买 nike

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

我的主要阻塞问题:

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

来自 Golang 的描述:

nameComponentRegexp restricts registry path component names to start with at least one letter or number, with following parts able to be separated by one period, one or two underscore and multiple dashes.

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

nameComponentRegexp = expression(
alphaNumericRegexp,
optional(repeated(separatorRegexp, alphaNumericRegexp)))

一些有效的例子:

  • a.a
  • a_a
  • a__a
  • a-a
  • a--a
  • 一个---一个

最佳答案

查看如何构建 nameComponentRegexp:从 alphaNumericRegexp 开始,然后匹配 1 个或多个 separatorRegexp+ 序列的 1 次或 0 次出现alphaNumericRegexp.

optional() 执行以下操作:

// optional wraps the expression in a non-capturing group and makes the
// production optional.

func optional(res ...*regexp.Regexp) *regexp.Regexp {  return match(group(expression(res...)).String() + `?`)}

repeated() 这样做:

// repeated wraps the regexp in a non-capturing group to get one or more
// matches.

func repeated(res ...*regexp.Regexp) *regexp.Regexp {  return match(group(expression(res...)).String() + `+`)}

因此,你需要的是

/^[a-z0-9]+(?:(?:[._]|__|-*)[a-z0-9]+)*$/

查看regex demo

详细信息:

  • ^ - 字符串的开始
  • [a-z0-9]+ - 1 个或多个字母数字符号
  • (?:(?:[._]|__|-*)[a-z0-9]+)* - 零个或多个序列:
    • (?:[._]|__|-*) - ., _, __,或 0+ 个连字符
    • [a-z0-9]+- 1个或多个字母数字符号

如果你想禁止像 aaaa 这样的字符串,你需要将模式中的所有 * 替换为 + ( demo ).

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));
}

关于javascript - 将 Golang 正则表达式转换为 JS 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45272267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com