我已经看到很多关于使整个正则表达式不区分大小写的例子.我想知道的是只有部分表达式不区分大小写.
例如,假设我有一个这样的字符串:
fooFOOfOoFoOBARBARbarbarbAr
Run Code Online (Sandbox Code Playgroud)
如果我想匹配所有出现的"foo"而不管大小写但我只想匹配大写的"BAR"怎么办?
理想的解决方案是适用于正则表达式的东西,但我也有兴趣听到语言特定的(感谢Espo)
编辑
Espo提供的链接非常有用.关于在表达式中打开和关闭修改器的例子很好.
对于我做作的例子,我可以这样做:
(?i)foo*(?-i)|BAR
Run Code Online (Sandbox Code Playgroud)
这使得匹配仅对匹配的foo部分不区分大小写.
这似乎适用于大多数正则表达式实现,除了Javascript,Python和其他一些(如Espo提到的).
我想知道的大问题(Perl,PHP,.NET)都支持内联模式更改.
Esp*_*spo 84
Perl允许您通过使用(?i :)模式修饰符使正则表达式的一部分不区分大小写.
现代正则表达式风格允许您仅将修饰符应用于正则表达式的一部分.如果在正则表达式的中间插入修饰符(?ism),则修饰符仅适用于修饰符右侧的正则表达式部分.您可以通过在前面加上减号来关闭模式.减号后的所有模式都将关闭.例如(?i-sm)打开不区分大小写,并关闭单线模式和多线模式.
并非所有正则表达式都支持这一点.JavaScript和Python将所有模式修饰符应用于整个正则表达式.它们不支持(?-ismx)语法,因为当模式修饰符应用于整个正则表达式时,关闭选项毫无意义.默认情况下,所有选项均已关闭
您可以快速测试正在使用的正则表达式处理模式修饰符的方式.正则表达式(?i)te(? - i)st应匹配test和TEst,但不匹配teST或TEST.
确实可以依赖内联修饰符,如打开和关闭仅部分正则表达式的模式中所述:
正则表达式
(?i)te(?-i)st应该匹配 test andTEst,但不匹配teSTorTEST。
但是,更多支持的功能是(?i:...)内联修饰符组(请参阅修饰符跨度)。语法是(?i:,然后是要使 cas 不敏感的模式,然后是).
(?i:foo)|BAR
Run Code Online (Sandbox Code Playgroud)
相反:如果您的模式是使用不区分大小写的选项编译的,并且您需要使正则表达式的一部分区分大小写,则-在?:之后添加(?-i:...)。
各种语言中的示例使用(用尖括号包裹匹配项):
preg_replace("~(?i:foo)|BAR~", '<$0>', "fooFOOfOoFoOBARBARbarbarbAr")(演示)re.sub(r'(?i:foo)|BAR', r'<\g<0>>', 'fooFOOfOoFoOBARBARbarbarbAr')( demo )(注意Pythonre自 Python 3.6 起支持内联修饰符组)Regex.Replace("fooFOOfOoFoOBARBARbarbarbAr", "(?i:foo)|BAR", "<$&>")(演示)"fooFOOfOoFoOBARBARbarbarbAr".replaceAll("(?i:foo)|BAR", "<$0>")(演示)$s =~ s/(?i:foo)|BAR/<$&>/g(演示)"fooFOOfOoFoOBARBARbarbarbAr".gsub(/(?i:foo)|BAR/, '<\0>')(演示)gsub("((?i:foo)|BAR)", "<\\1>", "fooFOOfOoFoOBARBARbarbarbAr", perl=TRUE)(演示)"fooFOOfOoFoOBARBARbarbarbAr".replacingOccurrences(of: "(?i:foo)|BAR", with: "<$0>", options: [.regularExpression])regexp.MustCompile(`(?i:foo)|BAR`).ReplaceAllString( "fooFOOfOoFoOBARBARbarbarbAr", `<${0}>`)(演示)在javascript、bash、sed、c++ std::regex、lua、tcl 中不受支持。