正则表达式:忽略大小写

556
我该如何让下面的正则表达式忽略大小写?它应该匹配所有正确的字符,但忽略它们是大写还是小写。
G[a-b].*

只需在正则表达式中包含大写字母和小写字母,或在进行正则表达式匹配之前将其转换为大写字母。 - Chetter Hummin
2
在这种一般情况下,G[a-bA-B].* 显然是最好的选择。大小写敏感性因平台而异,而您没有提供平台信息。 - Joachim Isaksson
25
如果你正在使用Java,你可以通过Pattern类指定这个:Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); - james.garriss
更多Java选项请参见:https://blogs.oracle.com/xuemingshen/entry/case_insensitive_matching_in_java - james.garriss
请注意,在使用 grep 命令时,只需添加 -i 修饰符即可进行不区分大小写的搜索。例如:grep -rni regular_expression 可以递归地搜索名为 'regular_expression' 的文件或目录,忽略大小写,并在结果中显示行号。 - Gabriel Staples
@JoachimIsaksson 更正:[Gg][abAB].* 你的正则表达式会错过 gable,因为它要求大写字母 G - Luv2code
15个回答

685

如果你希望整个正则表达式不区分大小写,你应该寻找i标志。几乎所有的正则表达式引擎都支持它:

/G[a-b].*/i

string.match("G[a-b].*", "i")

查阅您的语言/平台/工具文档,了解匹配模式的规范。

如果你只想让正则表达式中的一部分不区分大小写(就像我的原始回答所假定的那样),那么您有两个选择:

  1. 使用 (?i) 和 [可选的] (?-i) 模式修饰符:

    (?i)G[a-b](?-i).*
    
  2. 将所有变体(即小写和大写)放入正则表达式中——如果不支持模式修改符,则非常有用:

  3. [gG][a-bA-B].*
    

最后需要注意的是:如果你处理的是ASCII以外的Unicode字符,请检查你使用的正则表达式引擎是否能够正确支持它们。


太棒了!适用于:perl -pe 's/^utf-8?B?.$//gi' Cancer.1631,匹配/替换文件Cancer.1631中的字符串"UTF-8?B?"。这种方式失败了:perl -pe 's/^utf-8?B?.$//g' Cancer.1631,因为大小写不匹配。 - Victoria Stuart
8
如果这篇文章不是一个如此具体的例子,那么它会更加清晰。比如说,如果你想忽略另一个单词(如“.txt”和“.TXT”)的大小写,从这篇文章的答案来看,我仍然不确定该怎么做。 - Kyle Bridenstine
由于某些原因,您发布的正则表达式在“find”扩展正则表达式中无法工作。例如,“find . ( -type d -regextype posix-extended -regex '/./[a-c][^.]/i' )”不显示任何文件夹。而类似的正则表达式“find . ( -type d -regextype posix-extended -regex './[a-c][^.]' )”没有修饰符,可以显示正确的文件夹。有什么想法吗? - alpha_989
这里我正在尝试仅在当前文件夹中查找以字符 [a-c] 开头的所有文件夹,以进行更多操作。 - alpha_989
说实话,我会把选项2放在答案的主要部分,因为它是通用的,适用于所有正则表达式引擎。 - Puterdo Borato
对于Dart语言,RegExp类拥有一个参数: RegExp(String source, {bool multiLine = false, bool caseSensitive = true, - ThinkDigital

293

取决于实现方式,但我会使用

(?i)G[a-b].

变量:

(?i) case-insensitive mode ON    
(?-i) case-insensitive mode OFF
现代正则表达式支持对正则表达式的某一部分应用修饰符。如果你在正则表达式的中间插入修饰符 (?im),那么该修饰符只适用于修饰符右侧的正则表达式部分。使用这些正则表达式,你可以通过在修饰符前加上减号 (?-i) 来关闭模式。

描述来自页面:https://www.regular-expressions.info/modifiers.html


这是TortoiseHg搜索正则表达式引擎的修改器格式。 - mwolfe02
你能告诉我如何在Linux shell中通用地实现这个功能吗(比如在egrep中不使用“-i”开关)? - Krishna Gupta
3
解释 (?i) 的作用以及如何结束它((?-i))将会非常有帮助。这就是为什么你的回答只有第一名问题的三分之一票数,而不是差不多一样多,因为他们解释了这个微妙的细节。 - Gabriel Staples
对于使用 https://pypi.org/project/regex/ 的人来说,在正则表达式组合中(即使用OR连接的正则表达式),在正则表达式中使用 (?i) 将使其具有比其他表达式更高的优先级(即顺序将不再与编写的正则表达式相同)。 - albero
在.NET/C#中对我有效。 - Justin Harris
这不是关于语言,而是正则表达式引擎的实现。但是很高兴听到它不仅限于Perl :D。 - elrado

101

验证输入是否为'ABC',不区分大小写的正则表达式。

(?i)(abc)

1
与Android Studio的logcat完美配合。 - Joe
也适用于Python。 - conner.xyz
1
同样适用于C#。 - Somto
在maXbox中也可以工作: writeln(ReplaceRegExpr('(?i)\bsubstring\b',loadfile,'newstring',false)); - Max Kleiner
在Java中运行良好。 - Alex Byrth
同样适用于SparkSQL。 - Chris

59

i 标记通常用于大小写不敏感的情况。在这里你没有给出具体的语言,但可能会使用类似于 /G[ab].*/i 或者 /(?i)G[ab].*/ 的表达式。


18

为了完整起见,我想添加在C++中使用Unicode的正则表达式的解决方案:

std::tr1::wregex pattern(szPattern, std::tr1::regex_constants::icase);

if (std::tr1::regex_match(szString, pattern))
{
...
}

1
有人能为我澄清一下为什么这篇帖子被踩了吗?接受的解决方案使用了特定的代码,为了完整起见,我想添加C++语言标准库的解决方案。在我看来,我为一个更普遍的问题增加了附加值。 - Holger Schmeken
szPattern是OP的G[a-b].*,而szString是要测试的字符串。 - jlaurens

8

JavaScript

如果您想让匹配不区分大小写,只需在正则表达式的结尾添加i

'Test'.match(/[A-Z]/gi) // 返回 ["T","e","s","t"]

如果不加i

'Test'.match(/[A-Z]/g) // 返回 ["T"]


8

根据MDN的说法,在JavaScript中,应该向RegExp构造函数传递i标志:

const regex = new RegExp('(abc)', 'i');

regex.test('ABc'); // true

6

C#

using System.Text.RegularExpressions;
...    
Regex.Match(
    input: "Check This String",
    pattern: "Regex Pattern",
    options: RegexOptions.IgnoreCase)

具体来说:选项:RegexOptions.IgnoreCase


5

我从这篇类似的帖子中发现(在AWK中忽略大小写),在旧版本的awk上(例如在原始的Mac OS X上),您可能需要使用'tolower($0) ~ /pattern/'

IGNORECASE(?i)/pattern/i将为每一行生成错误或返回true。


3
可能有一个简单的解决方案,如果模式不太复杂或过长,可使用[gG][aAbB].*。

很想知道为什么这个答案对于给定的问题是错误的? - alpha_989
你在回答中提到了“不太复杂或冗长”。 - reggaeguitar
这实际上是我案例中唯一有效的解决方案。而且它看起来是最通用的解决方案,应该在任何地方都能工作。所有其他答案似乎都非常特定于特定的正则表达式实现。 - Puterdo Borato

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接