天道酬勤,学无止境

不区分大小写的字典搜索? [复制](Case insensitive dictionary search? [duplicate])

问题

我可以使用 map 用 Python 实现不区分大小写的列表搜索。

a = ['xyz', 'wMa', 'Pma'];

b = map(string.lower, a)
if 'Xyz'.lower() in b:
    print 'yes'

我怎样才能用字典做同样的事情?

我尝试了以下代码,但 ap 具有 ['a','b','c'] 列表,而不是不区分大小写的字典。

a = {'a':1, 'B':2, 'c':3}
ap = map(string.lower, a)
回答1

请注意,使字典不区分大小写,无论如何都可能会丢失信息:例如,您将如何“不区分大小写” {'a': 23, 'A': 45} ?! 如果你只关心一个键在字典中的位置(即,不关心它对应的值是什么),那么创建一个set ——即

theset = set(k.lower() for k in thedict)

(在 Python 的每个版本中,或者{k.lower() for k in thedict}如果你对你的代码只在 Python 2.7 或更高版本中工作感到满意,为了一些纯粹的装饰性语法糖;-),并检查if k.lower() in theset: ...

或者,您可以创建一个包装类,例如,可能是只读的...:

import collections

class CaseInsensitiveDict(collections.Mapping):
    def __init__(self, d):
        self._d = d
        self._s = dict((k.lower(), k) for k in d)
    def __contains__(self, k):
        return k.lower() in self._s
    def __len__(self):
        return len(self._s)
    def __iter__(self):
        return iter(self._s)
    def __getitem__(self, k):
        return self._d[self._s[k.lower()]]
    def actual_key_case(self, k):
        return self._s.get(k.lower())

这将保留(实际上不改变原始字典,因此仍然可以在需要时为其检索所有精确信息)任意一个可能的多个键值中的任意一个“折叠”为单个键的键值 -不敏感,并提供字典的所有只读方法(仅带有字符串键)以及返回用于任何给定字符串键的实际大小写组合的actual_key_case方法(如果没有给定字符串键的大小写更改与任何键匹配,则为None词典)。

回答2

使用字典推导式 (Python2.7+)

a_lower = {k.lower():v for k,v in a.items()}

如果你的 python 太旧而无法理解字典

a_lower = dict((k.lower(),v) for k,v in a.items())

然后使用键的小写版本查找值

value = a_lower[key.lower()]
回答3

通过以下方式开始使用真正的不区分大小写的字典:

from requests.structures import CaseInsensitiveDict

或者,如果您想查看代码:

class CaseInsensitiveDict(dict):

    """Basic case insensitive dict with strings only keys."""

    proxy = {}

    def __init__(self, data):
        self.proxy = dict((k.lower(), k) for k in data)
        for k in data:
            self[k] = data[k]

    def __contains__(self, k):
        return k.lower() in self.proxy

    def __delitem__(self, k):
        key = self.proxy[k.lower()]
        super(CaseInsensitiveDict, self).__delitem__(key)
        del self.proxy[k.lower()]

    def __getitem__(self, k):
        key = self.proxy[k.lower()]
        return super(CaseInsensitiveDict, self).__getitem__(key)

    def get(self, k, default=None):
        return self[k] if k in self else default

    def __setitem__(self, k, v):
        super(CaseInsensitiveDict, self).__setitem__(k, v)
        self.proxy[k.lower()] = k
回答4
dict(zip(map(string.lower,a.keys()),a.values()))

会做你正在寻找的。

map(function,iterable) 在迭代器上工作; 字典的迭代是键列表。

a = {'a': 1, 'c': 3, 'B': 2}
for i in a:
 print a
# returns a c B

zip 将键和值重新组合成对,但作为一系列元组。 dict 将元组转换回 dict。

你也可以做类似的事情

def myfunc(t):
 return (string.lower(t[0]),t[1])

map(myfunc,a.items())
# returns [('a', 1), ('c', 3), ('b', 2)
dict(map(myfunc,a.items()))
# returns {'a': 1, 'c': 3, 'b': 2}

或者,更有趣...

dict(map(lambda (key, value):(string.lower(key),value),a.items()))
回答5

如果您不经常需要查找,则可以使用此功能而不会浪费其他字典副本的空间。 尽管每次都必须检查所有密钥,但速度很慢。

a = {'xyz':2, 'wMa':8, 'Pma':9}

## if you do not use many times and/or the dict is very big

def case_insensitive_key(a,k):
    k = k.lower()
    return [a[key] for key in a if key.lower() == k]

print 'yes' if case_insensitive_key(a,'Xyz') else 'no'
回答6

只是想添加 __setitem__, pop 到 Alex Martelli 的答案:

from collections import Mapping

class CaseInsensitiveDict(Mapping):
    def __init__(self, d):
        self._d = d
        self._s = dict((k.lower(), k) for k in d)
    def __contains__(self, k):
        return k.lower() in self._s
    def __len__(self):
        return len(self._s)
    def __iter__(self): 
        return iter(self._s)
    def __getitem__(self, k):
        return self._d[self._s[k.lower()]]
    def __setitem__(self, k, v):
        self._d[k] = v
        self._s[k.lower()] = k
    def pop(self, k):
        k0 = self._s.pop(k.lower())
        return self._d.pop(k0)
    def actual_key_case(self, k):
        return self._s.get(k.lower())

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 不区分大小写的字典(Case insensitive dictionary)
    问题 我希望我的字典不区分大小写。 我有以下示例代码: text = "practice changing the color" words = {'color': 'colour', 'practice': 'practise'} def replace(words,text): keys = words.keys() for i in keys: text= text.replace(i ,words[i]) return text text = replace(words,text) print text 输出=练习更改颜色 我想要另一个字符串, "practice changing the Color" ,(其中Color以大写Color开头)也要提供相同的输出。 我相信有一种通用的方法可以使用mydictionary[key.lower()]转换为小写字母,但是我不确定如何将其最好地集成到我的现有代码中。 (如果无论如何这将是一种合理,简单的方法)。 回答1 如果我对您的理解正确,并且希望以一种不区分大小写的方式键入字典的键,则一种方法是将dict子类化并重载setter / getter: class CaseInsensitiveDict(dict): def __setitem__(self, key, value): super
  • C#中字符串键类型不区分大小写的字典(Case-INsensitive Dictionary with string key-type in C#)
    问题 如果我有Dictionary<String,...>是否可以使ContainsKey方法不区分大小写? 这似乎相关,但我不太了解:c#字典:通过声明使Key不区分大小写 回答1 这似乎相关,但我不太了解:c#字典:通过声明使Key不区分大小写 确实是有关的。 解决方案是告诉字典实例不要使用标准的字符串比较方法(区分大小写),而要使用不区分大小写的方法。 这是使用适当的构造函数完成的: var dict = new Dictionary<string, YourClass>( StringComparer.InvariantCultureIgnoreCase); 构造函数需要一个IEqualityComparer,它可以告诉字典如何比较键。 StringComparer.InvariantCultureIgnoreCase提供了一个IEqualityComparer实例,该实例以不区分大小写的方式比较字符串。 回答2 var myDic = new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase); myDic.Add("HeLlo", "hi"); if (myDic.ContainsKey("hello")) Console.WriteLine(myDic["hello"]); 回答3
  • 通用字典不区分大小写的访问(Case insensitive access for generic dictionary)
    问题 我有一个使用托管dll的应用程序。 这些dll之一返回通用字典: Dictionary<string, int> MyDictionary; 该词典包含大小写键。 另一方面,我得到了潜在键(字符串)的列表,但是我不能保证这种情况。 我正在尝试使用键来获取字典中的值。 但是当然,由于我的案例不匹配,因此以下操作将失败: bool Success = MyDictionary.TryGetValue( MyIndex, out TheValue ); 我希望TryGetValue具有MSDN doc中提到的忽略大小写标志,但是看来这对于通用词典是无效的。 有没有一种方法可以在忽略键值的情况下获取该词典的值? 是否有比使用适当的StringComparer.OrdinalIgnoreCase参数创建字典的新副本更好的解决方法? 回答1 在尝试获取值时,无法指定StringComparer 。 如果考虑一下, "foo".GetHashCode()和"FOO".GetHashCode()完全不同,因此没有合理的方法可以在区分大小写的哈希映射上实现不区分大小写的get。 但是,您可以使用以下命令首先创建不区分大小写的字典: var comparer = StringComparer.OrdinalIgnoreCase; var caseInsensitiveDictionary =
  • 制作HashSet 不区分大小写(Make HashSet<string> case-insensitive)
    问题 我有HashSet参数的方法。 我需要在其中包含不区分大小写的包含内容: public void DoSomething(HashSet<string> set, string item) { var x = set.Contains(item); ... } 有什么办法可以使现有的HashSet不区分大小写(不创建新的)? 我正在寻找性能最佳的解决方案。 编辑 包含可以被多次调用。 所以IEnumerable扩展对我来说是不可接受的,因为它的性能低于本机的HashSet Contains方法。 解决方案 既然,回答我的问题是“否”,那是不可能的,我创建并使用了以下方法: public HashSet<string> EnsureCaseInsensitive(HashSet<string> set) { return set.Comparer == StringComparer.OrdinalIgnoreCase ? set : new HashSet<string>(set, StringComparer.OrdinalIgnoreCase); } 回答1 HashSet<T>构造函数有一个重载,可让您传递自定义IEqualityComparer<string> 。 在静态StringComparer类中已经为您定义了其中一些,其中一些忽略大小写。 例如: var set
  • JSON.NET JObject键比较不区分大小写(JSON.NET JObject key comparison case-insensitive)
    问题 我正在使用Newtonsoft Json.net解析JSON字符串。 我将字符串转换为JObject。 当通过键访问元素的值时,我要比较是不区分大小写的。 在下面的代码中,我使用“ FROM”作为键。 我希望它在json [“ FROM”]。ToString()行返回字符串“ 1”。 但是失败了。 是否可以使下面的代码正常工作? String ptString = "{from: 1, to: 3}"; var json = (JObject)JsonConvert.DeserializeObject(ptString); String f = json["FROM"].ToString(); 回答1 c#允许您将字典与不区分大小写的键一起使用,因此我使用的解决方法是将JObject转换为具有StringComparer.CurrentCultureIgnoreCase设置的字典,如下所示: JObject json = (JObject)JsonConvert.DeserializeObject(ptString); Dictionary<string, object> d = new Dictionary<string, object>(json.ToObject<IDictionary<string, object>>(), StringComparer
  • PostgreSQL是否支持“不区分重音”的排序规则?(Does PostgreSQL support “accent insensitive” collations?)
    问题 在Microsoft SQL Server中,可以指定“不区分重音”的排序规则(对于数据库,表或列),这意味着可以对诸如 SELECT * FROM users WHERE name LIKE 'João' 查找具有Joao名称的行。 我知道可以使用unaccent_string contrib函数从PostgreSQL的字符串中删除重音符号,但是我想知道PostgreSQL是否支持这些“不区分重音”的排序规则,以便上面的SELECT起作用。 回答1 为此,请使用unaccent模块-这与您要链接的模块完全不同。 unaccent是一种文本搜索词典,用于删除词素中的重音符号。 每个数据库安装一次: CREATE EXTENSION unaccent; 如果出现类似以下错误: ERROR: could not open extension control file "/usr/share/postgresql/<version>/extension/unaccent.control": No such file or directory 按照以下相关答案中的指示,在数据库服务器上安装contrib软件包: 在PostgreSQL上创建不突出扩展名时出错 除其他外,它提供了可与示例一起使用的unaccent()函数unaccent()似乎不需要LIKE )。 SELECT *
  • 包含不区分大小写的方法而没有重大代码更改?(Contains method case-insensitive without major code changes?)
    问题 有没有办法忽略 contains() 方法的情况,但同时让代码片段或多或少保持不变? /** * This method returns a list of all words from the dictionary that include the given substring. * */ public ArrayList<String> wordsContaining(String text) { int index = 0; ArrayList<String> wordsContaining = new ArrayList<String>(); while(index<words.size()) { if((words.get(index).contains(text))) { wordsContaining.add(words.get(index)); } index++; } return wordsContaining; } 这是整个 SpellChecker 类: public class SpellChecker { private ArrayList<String> words; private DictReader reader; /** * Constructor for objects of class SpellChecker */ public
  • 如何使用StringBuilder进行大小写不敏感的替换(How to do a multiple case insensitive replace using a StringBuilder)
    问题 我有一个(大)模板,想要替换多个值。 更换需要区分大小写。 还必须有模板中不存在的键。 例如: [TestMethod] public void ReplaceMultipleWithIgnoreCaseText() { const string template = "My name is @Name@ and I like to read about @SUBJECT@ on @website@, tag @subject@"; const string expected = "My name is Alex and I like to read about C# on stackoverflow.com, tag C#"; var replaceParameters = new List<KeyValuePair<string, string>> { new KeyValuePair<string, string>("@name@","Alex"), new KeyValuePair<string, string>("@subject@","C#"), new KeyValuePair<string, string>("@website@","stackoverflow.com"), // Note: The next key does not exist in
  • 不区分大小写的列表搜索(Case-Insensitive List Search)
    问题 我有一个包含一串字符串的列表testList 。 我想仅在列表中尚不存在新字符串时才将其添加到testList中。 因此,我需要对列表进行不区分大小写的搜索并使其高效。 我不能使用Contains因为它没有考虑大小写。 由于性能原因,我也不想使用ToUpper/ToLower 。 我碰到了这种方法,它的工作原理是: if(testList.FindAll(x => x.IndexOf(keyword, StringComparison.OrdinalIgnoreCase) >= 0).Count > 0) Console.WriteLine("Found in list"); 可以,但是也可以匹配部分单词。 如果列表中包含“山羊”,则无法添加“燕麦”,因为它声称列表中已经包含“燕麦”。 有没有一种方法可以以不区分大小写的方式有效地搜索列表,而单词必须完全匹配? 谢谢 回答1 可以使用String.Equals而不是String.IndexOf来确保没有部分匹配。 也不要使用FindAll,因为它遍历每个元素,请使用FindIndex(它停在它遇到的第一个元素上)。 if(testList.FindIndex(x => x.Equals(keyword, StringComparison.OrdinalIgnoreCase) ) != -1) Console.WriteLine
  • MongoDB:是否可以进行不区分大小写的查询?(MongoDB: Is it possible to make a case-insensitive query?)
    问题 例子: > db.stuff.save({"foo":"bar"}); > db.stuff.find({"foo":"bar"}).count(); 1 > db.stuff.find({"foo":"BAR"}).count(); 0 回答1 您可以使用正则表达式。 在您的示例中,将是: db.stuff.find( { foo: /^bar$/i } ); 不过,我必须说,也许您可​​以在输入过程中小写(或大写)该值,而不是每次找到它都会产生额外的成本。 显然,这不适用于人们的姓名等,但可能适用于诸如标签之类的用例。 回答2 更新: 原来的答案现在已经过时了。 Mongodb现在支持具有许多功能的高级全文搜索。 原始答案: 应该注意的是,使用正则表达式的不区分大小写的/ i进行搜索意味着mongodb无法按索引进行搜索,因此对大型数据集的查询可能需要很长时间。 即使只有很小的数据集,它也不是很有效。 您获得的CPU命中率比查询授权要大得多,如果您要实现规模化,这可能会成为一个问题。 或者,您可以存储大写副本并对其进行搜索。 例如,我有一个User表,该表的用户名是大小写混合的,但是id是用户名的大写副本。 这确保了区分大小写的复制是不可能的(不允许同时包含“ Foo”和“ foo”),并且我可以通过id = username.toUpperCase()进行搜索
  • 包含不区分大小写的(Contains case insensitive)
    问题 我有以下几点: if (referrer.indexOf("Ral") == -1) { ... } 我喜欢做的是让Ral区分大小写的,所以它可以RAl , rAl等,仍然匹配。 有没有办法说Ral必须不区分大小写? 回答1 加入.toUpperCase()后referrer 。 此方法将字符串转换为大写字符串。 然后,使用RAL代替Ral使用.indexOf() 。 if (referrer.toUpperCase().indexOf("RAL") === -1) { 使用正则表达式也可以实现相同的目的(在要针对动态模式进行测试时特别有用): if (!/Ral/i.test(referrer)) { // ^i = Ignore case flag for RegExp 回答2 另一种选择是使用搜索方法,如下所示: if (referrer.search(new RegExp("Ral", "i")) == -1) { ... 看起来更优雅,然后将整个字符串转换为小写,这样可能会更有效率。 使用toLowerCase() ,代码对字符串进行了两次遍历,一次遍历了整个字符串以将其转换为小写,另一遍是寻找所需的索引。 使用RegExp ,代码可以遍历看起来与所需索引匹配的字符串。 因此,在长字符串上,我建议使用RegExp版本(我想在短字符串上
  • 如何使jQuery包含不区分大小写的内容,包括jQuery 1.8+?(How do I make jQuery Contains case insensitive, including jQuery 1.8+?)
    问题 我试图不区分大小写地使用“包含”大小写。 我尝试在以下stackoverflow问题上使用该解决方案,但没有成功: 是否存在不区分大小写的jQuery:包含选择器? 为了方便起见,将解决方案复制到此处: jQuery.extend( jQuery.expr[':'], { Contains : "jQuery(a).text().toUpperCase().indexOf(m[3].toUpperCase())>=0" }); 这是错误: Error: q is not a function Source File: /js/jquery-1.4.js?ver=1.4 Line: 81 这是我正在使用的地方: $('input.preset').keyup(function() { $(this).next().find("li").removeClass("bold"); var theMatch = $(this).val(); if (theMatch.length > 1){ theMatch = "li:Contains('" + theMatch + "')"; $(this).next().find(theMatch).addClass("bold"); } }); 在相同的情况下,我对原始区分大小写的“包含”的使用没有任何错误。 有人有什么想法吗?
  • 如何明智地将带状疱疹和edgeNgram结合使用,以提供灵活的全文本搜索?(How to wisely combine shingles and edgeNgram to provide flexible full text search?)
    问题 我们有一个与OData兼容的API,它将某些全文搜索需求委派给Elasticsearch集群。 由于OData表达式可能变得非常复杂,因此我们决定将它们简单地转换为等效的Lucene查询语法,并将其输入到query_string查询中。 我们确实支持一些与文本相关的OData过滤器表达式,例如: startswith(field,'bla') endswith(field,'bla') substringof('bla',field) name eq 'bla' 该领域,我们会等额对可analyzed , not_analyzed或两者(即通过多场)。 搜索的文本可以是单个标记(例如table ),仅一部分(例如tab )或几个标记(例如table 1. , table 10等)。 搜索必须不区分大小写。 以下是一些我们需要支持的行为的示例: startswith(name,'table 1')必须匹配“ Table 1 ”,“ table 1 00”,“ Table 1 .5”,“ table 1 12 upper level” endswith(name,'table 1')必须与“ Room 1, Table 1 ”,“ Sub table 1 ”,“ table 1 ”,“ Jeff table 1 ”匹配 substringof('table 1',name
  • 如何使用 postgresql 在 Rails 中执行不区分大小写的顺序(How to do case-insensitive order in Rails with postgresql)
    问题 我正在将我的开发环境从 sqlite3 切换到 postgresql 8.4 并遇到最后一个障碍。 在我的原文中,我在辅助方法中有以下行; result = Users.find(:all, :order => "name collate NOCASE") 它提供了一个非常好的不区分大小写的搜索。 我无法为 postgresql 复制这个。 应该很容易 - 有什么想法吗? 谢谢。 回答1 result = Users.find(:all, :order => "LOWER(name)") 从布拉德和弗兰克那里拿一点。 回答2 LanecH 的答案适用于 Rails 3+(包括 Rails 4 和 5): users = User.order('LOWER(name)') 或者创建一个可以重用的命名范围: class User < ActiveRecord::Base scope :order_by_name, -> { order('LOWER(name)') } end users = User.order_by_name 回答3 现在使用 Rails 5.2,如果使用已接受的答案,您可能会收到警告。 弃用警告:使用非属性参数调用的危险查询方法(其参数用作原始 SQL 的方法):“LOWER(?) ASC”。 另一种可能是依赖 Arel(它现在已合并到 Rails 中):
  • 如何在SOLR中创建字符串字段的不区分大小写的副本?(How to create a case insensitive copy of a string field in SOLR?)
    问题 如何创建不区分大小写形式的字符串字段的副本? 我想使用典型的“字符串”类型和不区分大小写的类型。 这些类型的定义如下: <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true" /> <!-- A Case insensitive version of string type --> <fieldType name="string_ci" class="solr.StrField" sortMissingLast="true" omitNorms="true"> <analyzer type="index"> <tokenizer class="solr.KeywordTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory" /> </analyzer> <analyzer type="query"> <tokenizer class="solr.KeywordTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory" /> </analyzer> </fieldType> 像这样的领域的一个例子: <field name=
  • 如何在Vim中进行不区分大小写的搜索(How to do case insensitive search in Vim)
    问题 我想搜索一个大写单词,例如文件中的COPYRIGHT。 我尝试执行类似的搜索: /copyright/i # Doesn't work 但这是行不通的。 我知道在Perl中,如果将i标志赋予正则表达式,它将把正则表达式变成不区分大小写的正则表达式。 Vim似乎有其自己的方式来表示不区分大小写的正则表达式。 回答1 您可以在模式中的任何位置使用\c转义序列。 例如: /\ccopyright或/copyright\c甚至/copyri\cght 要进行逆运算(区分大小写的匹配),请改用\C (大写C)。 回答2 以及对\c和ignorecase的建议,我发现smartcase非常有用。 如果搜索包含大写字符的内容,它将进行区分大小写的搜索; 如果您搜索的内容完全是小写字母,它将执行不区分大小写的搜索。 您可以使用\c和\C来覆盖它: :set ignorecase :set smartcase /copyright " Case insensitive /Copyright " Case sensitive /copyright\C " Case sensitive /Copyright\c " Case insensitive 看: :help /\c :help /\C :help 'smartcase' 回答3 您可以在搜索前在Vim中设置ic选项: :set ic
  • 不区分大小写(Case insensitive 'in')
    问题 我喜欢使用表达 if 'MICHAEL89' in USERNAMES: ... 其中USERNAMES是列表。 有什么方法可以区分大小写不敏感的项目,还是需要使用自定义方法? 只是想知道是否需要为此编写额外的代码。 回答1 username = 'MICHAEL89' if username.upper() in (name.upper() for name in USERNAMES): ... 或者: if username.upper() in map(str.upper, USERNAMES): ... 或者,可以的,您可以自定义方法。 回答2 我会做一个包装纸,这样您就可以做到无创。 至少,例如...: class CaseInsensitively(object): def __init__(self, s): self.__s = s.lower() def __hash__(self): return hash(self.__s) def __eq__(self, other): # ensure proper comparison between instances of this class try: other = other.__s except (TypeError, AttributeError): try: other = other.lower
  • MySQL如何在UTF-8中“不区分大小写”和“不区分重音”的工作方式(How to MySQL work “case insensitive” and “accent insensitive” in UTF-8)
    问题 我在“ utf8-UTF-8 Unicode”中有一个模式作为字符集,并有一个排序规则“ utf8_spanish_ci”。 所有内部表都是具有相同字符集和排序规则的InnoDB。 问题来了: 用类似的查询 SELECT * FROM people p WHERE p.NAME LIKE '%jose%'; 我得到83个结果行。 我应该有84个结果,因为我知道。 更改位置: WHERE p.NAME LIKE '%JOSE%'; 我得到完全相同的83行。 使用JoSe,Jose,JOSe等组合时,将报告所有相同的83行。 当游戏中出现口音时,问题就来了。 如果这样做: WHERE p.NAME LIKE '%josé%'; 我没有结果。 0行。 但是,如果我这样做: WHERE p.NAME LIKE '%JOSÉ%'; 我只得到一行结果,所以只有1行。 这是唯一强调“ jose”并大写的行。 我尝试过使用josÉ或JoSÉ或我所做的任何组合,只要带重音的字母保持为大写或不大写,因为它实际上存储在数据库中,并且仍然返回唯一的行。 如果我突然用JOSE中的大写字母将“É”更改为“é”,它将不返回任何行。 因此得出结论: 如果游戏中没有拉丁字符,则不区分大小写。 如果出现拉丁字符,则区分大小写。 口音敏感,就像我搜索JOSE或jose一样,我只得到83行,而不是我需要的84行。
  • PHP不区分大小写的in_array函数(PHP case-insensitive in_array function)
    问题 使用in_array函数时是否可以进行不区分大小写的比较? 因此,使用这样的源数组: $a= array( 'one', 'two', 'three', 'four' ); 以下查找将全部返回true: in_array('one', $a); in_array('two', $a); in_array('ONE', $a); in_array('fOUr', $a); 哪些功能或一组功能会做同样的事情? 我不认为in_array本身可以做到这一点。 回答1 您可以使用preg_grep(): $a= array( 'one', 'two', 'three', 'four' ); print_r( preg_grep( "/ONe/i" , $a ) ); 回答2 显而易见的事情是将搜索词转换为小写: if (in_array(strtolower($word), $array)) { ... 当然,如果数组中有大写字母,则需要先执行以下操作: $search_array = array_map('strtolower', $array); 并搜索。 每次搜索都对整个数组执行strtolower毫无意义。 但是搜索数组是线性的。 如果你有一个大的数组或你打算这样做了很多,这将是更好地把搜索条件在阵列的关键,因为这将是更快的访问: $search_array = array
  • 您如何使用 less 使用模式修饰符进行不区分大小写的搜索?(How do you do a case insensitive search using a pattern modifier using less?)
    问题 似乎唯一的方法是在您最初运行较少时传递 -i 参数。 有没有人知道一些秘密黑客来制作这样的作品 /something to search for/i 回答1 您还可以在 less 运行时键入 command -I 。 它切换搜索是否区分大小写。 回答2 您还可以设置环境变量LESS 我使用LESS=-Ri ,以便我可以将grep彩色输出泵入其中,并保持 ANSI 颜色序列。 我发现的另一个很少使用的 less 功能是以+F作为参数开始的(或者在 less 时按SHIFT + F )。 这会导致它跟随您打开的文件,就像tail -f <file> 。 如果您正在查看来自应用程序的日志文件,并且可能想要进行页面备份(例如,如果它每秒生成 100 行日志记录),则非常方便。 回答3 @Juha 所说的附加内容:实际上-i使用 SmartCasing 启用不区分大小写,即如果您的搜索包含大写字母,则搜索将区分大小写,否则将不区分大小写。 把它想象成:set smartcase在 Vim 中。 例如:使用-i ,在 'Log,..' 中搜索 'log' 将匹配,而在 'log,..' 中搜索 'Log' 将不匹配。 回答4 您似乎可以在每次搜索的基础上调用此功能,如下所示: less prompt> /search string/-i 此选项位于less的交互式帮助中