Javascript正则表达式难倒了

标签 javascript regex

您好,我正在使用 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/

相关文章:

javascript - Sequelize Where 语句与日期

javascript - 你能在 JavaScript 中继承私有(private)函数吗?

javascript - 评估字符串的方法

javascript - 正则表达式接受 4 个不同模式的字符

带有整数运算的python re.sub

javascript - 如何使用正则表达式匹配多个字符串?

python - 如何编写此正则表达式来匹配整个字符串?

javascript动态添加类而不使用内联函数

javascript - 需要使广告牌实体具有可选择的回调功能并且可能弹出信息

regex - 在 powershell 中按正则表达式内的命名捕获组排序