正则表达式:忽略大小写


316

如何使以下正则表达式忽略大小写?它应该匹配所有正确的字符,但忽略它们是小写还是大写。

G[a-b].*

在进行正则表达式匹配之前,只需将大写和小写字母都包含在正则表达式中或将其转换为大写字母
Chetter Hummin 2012年

2
在这种一般情况下,G [a-bA-B]。*很明显,区分大小写取决于afaik平台,而您没有提供平台。
Joachim Isaksson 2012年

16
如果您使用的是Java,则可以使用Pattern类指定它Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
james.garriss 2014年


请注意,grep仅添加-i修饰符即可。例如:grep -rni regular_expression以递归方式搜索此“ regular_expression”“ r”,区分大小写“ i”,结果中显示“ n”行。
加布里埃尔·斯台普斯

Answers:


444

假设您希望整个正则表达式忽略大小写,则应查找iflag。几乎所有的正则表达式引擎都支持它:

/G[a-b].*/i

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

检查您的语言/平台/工具的文档以找到如何指定匹配模式。

如果只希望正则表达式的一部分不区分大小写(如我的原始答案所假定),则有两种选择:

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

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

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

最后一点:如果您要处理ASCII以外的Unicode字符,请检查您的正则表达式引擎是否正确支持它们。


辉煌!适用于:perl -pe's / ^ utf-8 \?B \?。* $ // gi'Cancer.1631,匹配/替换字符串“ UTF-8?B?” 在文件Cancer.1631中。这将失败:由于大小写不匹配,perl -pe's / ^ utf-8 \?B \?。* $ // g'Cancer.1631。
维多利亚·斯图尔特

如果不是这样的具体例子,这篇文章会更加清晰。就像您要忽略另一个单词(例如“ .txt”和“ .TXT”)的大小写一样。通过查看此答案,我仍然不确定如何做到这一点。
凯尔·布​​莱恩斯汀

由于某种原因,您发布的正则表达式在find扩展正则表达式中find . \( -type d -regextype posix-extended -regex '/./[a-c][^.]*/i' \)不起作用。例如,不显示任何文件find . \( -type d -regextype posix-extended -regex './[a-c][^.]*' \)夹。知道为什么吗?
alpha_989 '18年

在这里,我想找到的所有文件夹开始字符[a-c]在当前文件夹只..做更多的操作..
alpha_989

老实说,我将选项2放在答案的主要部分,因为它是通用的,并且可以与所有正则表达式引擎一起使用。
Puterdo Borato

154

取决于实现,但我会用

(?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”开关)吗?
克里希纳·古普塔

1
解释什么 (?i)以及如何结束((?-i))确实很有帮助。这就是为什么您的答案获得第一名问题的1/3票而不是第一名问题的几乎全票的原因,因为他们解释了这个微妙的细节。
加布里埃尔·斯台普斯


47

i标志通常用于区分大小写。您在此处没有提供语言,但可能会类似于/G[ab].*/i/(?i)G[ab].*/


15

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

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

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

1
有人可以向我澄清为什么这篇文章被否决吗?接受的解决方案使用特定的代码,为了完整起见,我想为c ++语言的标准库添加解决方案。我认为,我为一个更普遍的问题创造了附加价值。
Frankenstein

5

正如我从类似的帖子(AWK中的ignorecase)中发现的那样,在awk的旧版本(例如在香草Mac OS X上)上,可能需要使用'tolower($0) ~ /pattern/'

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


2

C#

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

具体来说:选项:RegexOptions.IgnoreCase


1

如果模式不太复杂或太长,[gG] [aAbB]。*可能会简化解决方案。


想知道为什么这个答案对于给定的问题是错误的吗?
alpha_989 '17

您在回答“不是太复杂或太长”中就拥有了它
reggaeguitar

实际上,这是唯一适用于我的案例的解决方案。而且,它似乎是应该在任何地方都可以使用的最通用的解决方案。所有其他答案似乎都是针对特定正则表达式实现的。
Puterdo Borato

1

除了已经接受的答案:

Grep用法:

请注意,grep仅添加-i修饰符即可。例如:grep -rni regular_expression以递归方式搜索此“ regular_expression”“ r”,区分大小写“ i”,结果中显示“ n”行。

另外,这是一个验证正则表达式的好工具:https : //regex101.com/

例如:请参阅此图中的表达式和解释。

在此处输入图片说明

参考文献:


0

在Java中,Regex构造函数具有

Regex(String pattern, RegexOption option)

所以要忽略大小写

option = RegexOption.IGNORE_CASE

0

您可以使用查找/替换在Visual Studio和Visual Studio Code中练习Regex。

您需要为大小写的正则表达式选择匹配大小写和正则表达式。其他[AZ]无效,请在此处输入图片说明

Visual Studio 2019社区


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.