gpt4 book ai didi

regex - 是否有其他正则表达式语法可避免出现 “look-around, including look-ahead and look-behind, is not supported”错误?

转载 作者:行者123 更新时间:2023-12-03 11:34:15 27 4
gpt4 key购买 nike

我尝试实现此正则表达式来检查字符串("username")的长度是否在3到30之间,是否仅包含字母(a-z),数字(0-9)和句点(.)(不连续):

use regex::Regex; // 1.3.5

fn main() {
Regex::new(r"^(?=.{3,30}$)(?!\.)(?!.*\.$)(?!.*?\.\.)[a-z0-9.]+$").unwrap();
}

尝试编译正则表达式时,出现以下错误:

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
regex parse error:
r"^(?=.{3,30}$)(?!\.)(?!.*\.$)(?!.*?\.\.)[a-z0-9.]+$").unwrap();
^^^
error: look-around, including look-ahead and look-behind, is not supported
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

是否有替代的正则表达式或用这些要求验证字符串的方法?

我可以按照建议删除长度 {3,30}并获取字符串长度,但是对于第二部分 (?!\.)(?!.*\.$)(?!.*?\.\.)[a-z0-9.]+$(防止连续的点)?

最佳答案

当前的问题是“正则表达式”的含义。 Wikipedia对此有很好的信息,但是简单的总结是,常规语言是一种通过一些简单的操作定义的语言,包括文字匹配,交替和Kleene星号(匹配零个或多个)。正则表达式库增加了一些功能,这些功能不会扩展此语言,但是使它更易于使用(例如能够说[a-z]而不是(a|b|c|d|e|f...|z))。

然后是Perl,它实现了对正则表达式的支持。但是,它没有使用正则表达式常用的NFA/DFA实现,而是使用回溯实现了它们。这样有两个结果,一是它允许添加常规语言之外的内容,例如回溯,二是它确实非常缓慢。

许多语言都使用了正则表达式的这些回溯实现,但是最近出现了一些从表达式中删除使它们难以高效实现的功能的回潮,特别是回溯。 Go已经做到了这一点,Re2 library是此的C/C++实现。而且,正如您所发现的,regex crate也可以这种方式工作。优点是它总是在线性时间匹配。

对于您的特定示例,您尝试匹配的内容实际上仍然是一种常规语言,只是必须以不同的方式表达。让我们从简单的部分开始,匹配字符,但不允许连续的点。与其以这种方式思考,不如将其视为匹配字符之间的点,但是字符本身不是选项。换句话说,我们可以匹配:[a-z0-9](\.?[a-z0-9])*。我们首先匹配一个字符。如果要允许它以点开头,则可以删除此部分。然后,我们需要零次或多次出现可选的点,然后是单个非点字符。如果要在末尾加点,则可以附加\.?

第二个要求(3到30个字符)会使此正则表达式变得相当复杂,因为我们重复的序列是1或2个字符。我建议,除了检查正则表达式外,还应该以编程方式检查长度。您还可以创建第二个正则表达式来检查长度,并检查两者是否匹配(常规语言没有and操作)。

您可能还会发现,取决于您的匹配方式,您可能必须 anchor 定匹配项(在开头放置^,在结尾放置$)。

A solution to the full problem:

use regex::Regex; // 1.3.5

fn main() {
let pat = Regex::new(r"^[a-z0-9](\.?[a-z0-9])*$").unwrap();
let names = &[
"valid123",
"va.li.d.12.3",
".invalid",
"invalid.",
"double..dot",
"ss",
"really.long.name.that.is.too.long",
];
for name in names {
let len = name.len();
let valid = pat.is_match(name) && len >= 3 && len <= 30;
println!("{:?}: {:?}", name, valid);
}
}

关于regex - 是否有其他正则表达式语法可避免出现 “look-around, including look-ahead and look-behind, is not supported”错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61485063/

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