gpt4 book ai didi

Javascript正则表达式难倒了

转载 作者:行者123 更新时间:2023-11-28 13:11:49 25 4
gpt4 key购买 nike

您好,我正在使用 JavaScript 应用程序,需要帮助来解决这个正则表达式

我有一系列字符串。它们是动态的,但确实有固定的模式。

name eq 'abc'
id in 'def'
key | operator | value

然后我有一个修饰符“has”

has name eq 'abc'
!has id
has address eq '123 sesame street'
|modifier | key | operator | value

我能够使用这个正则表达式提取修饰符和键,没有问题

new RegExp(/(^(\s*!?has\s+)?([^\s]+)|(^\s*[^\s]+))/i)

但是当我有一个与修饰符相同的键时就会出现问题

has eq '123'

上面的正则表达式返回“has eq”,而我只需要“has”

has has eq '123'

上面正确返回“has has”

有大量的运算符需要处理,但它们是一个设定值

如有任何帮助,我们将不胜感激

最佳答案

您需要具体并完全指定所有有效语法:

var keyval = ''

keyval += "^\s*(\w+)\s+eq\s+'(.*)'$"; // for key eq 'val'
keyval += "|^\s*has\s(\w+)\s+eq\s+'(.*)'$"; // for has key eq 'val'

new RegExp(keyval, 'i');

我不确定您是否需要没有值的 has var!has var 行,如果需要,您可以添加:

keyval += "|^\s*!?has\s+(\w+)$";  // for has key and !has key

请注意,正则表达式的主要问题是无法识别 eq 是一个重要的关键字。

<小时/>

附加说明:

就我个人而言,我不会为此使用一个正则表达式。这样做会使正则表达式变得又长又复杂,并且还会使提取匹配变得困难。您可以使用上面的技巧来分解长正则表达式,但在我看来,最好使用许多较小的正则表达式。我会写如下内容:

var key_equal_pattern     = /^\s*(\w+)\s+eq\s+'(.*)'$/i;
var has_key_equal_pattern = /^\s*has\s(\w+)\s+eq\s+'(.*)'$/i;
var has_patten = /^\s*!?has\s+(\w+)$/i;

if ((m = input.match(key_equal_pattern)) !== null) {
// handle match
}
else if ((m = input.match(has_key_equal_pattern)) !== null) {
// handle match
}
else if ((m = input.match(has_patten)) !== null) {
// handle match
}

与巨大的正则表达式相比,这更易于维护。请注意,虽然俗话说你不能用正则表达式解析像 html 这样的东西,但人们真正想说的是你不能在单个正则表达式中做到这一点。几乎所有 html 解析器在标记化过程中都使用正则表达式,然后使用 iffor 循环来处理数据的结构。

关于Javascript正则表达式难倒了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41839661/

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