JavaScript 正则表达式中部分字符串不区分大小写 (?i) 选项不起作用

问题描述 投票:0回答:2

我正在使用 Nodejs 构建一个应用程序,在该应用程序中我需要处理某些字符串,为此我使用了 JS“RegExp”对象。 我希望正则表达式中的字符串的一部分不区分大小写

var key = '(?i)c(?-i)ustomParam';
var find = '\{(\\b' + key +'\\b:?.*?)\}';
var regex = new RegExp(find,"g");

但它因以下错误而中断

语法错误:无效的正则表达式:/{( (?i)c(?-i)ustomParam :?.*?)}/

我将从某些外部源(如redis)获取密钥,并从其他外部源获取要匹配的字符串,我希望第一个字母表不区分大小写,其余字母表区分大小写。

当我从外部源获取密钥时,我将在第一个字母之前附加 (?i),在第一个字母之后附加 (?-i)。

我什至尝试过这个只是为了开始,但这也不起作用

var key ='customParam';
var find = '(?i)\{(\\b' + key +'\\b:?.*?)\}(?-i)';
var regex = new RegExp(find,"g");

我知道我可以使用“i”标志而不是上面的标志,但这不是我的用例。我这样做只是为了检查。

javascript regex case-insensitive
2个回答
12
投票

JavaScript 内置

RegExp
不支持内联修饰符,例如
(?im)
,更不用说可以放置在模式内任何地方的内联修饰符组(例如
(?i:....)
)。

即使 XRegExp 无法提供此功能,您也只能在整个模式上使用

(?i)
,并在模式开头声明它。

在 XRegExp 中,您只能将正则表达式定义为

var regex = XRegExp('(?i)\\{(\\b' + key +'\\b:?.*?)\\}', 'g');

2020 年 5 月 27 日,JavaScript 原生 RegExp 和 XRegExp 模式仍然不支持内联修饰符组(即

(?i:...)
),也不将它们放置在模式的任何部分(就 XRegExp 而言)。


0
投票

Chrome 122 开始,可以使用 RegExp 修饰符

要为子表达式启用标志,请使用

(?X:subexpr)
,其中 X 是
i
m
s
之一。
要禁用子表达式的标志,请使用
(?-X:subexpr)

为正则表达式的一部分启用标志:

const r1 = /^(?i:[a-z])[a-z]$/;
r1.test("ab"); // true
r1.test("Ab"); // true
r1.test("aB"); // false

禁用正则表达式部分的标志:

const r2 = /^[a-z](?-i:[a-z])$/i;
r2.test("ab"); // true
r2.test("Ab"); // true
r2.test("aB"); // false
© www.soinside.com 2019 - 2024. All rights reserved.