标签: string-search

stripos在使用特殊字符时返回false

我正在使用stripos函数来检查字符串是否位于另一个字符串内,忽略任何情况.

这是问题所在:

stripos("ø", "Ø")
Run Code Online (Sandbox Code Playgroud)

返回false.而

stripos("Ø", "Ø")
Run Code Online (Sandbox Code Playgroud)

返回true.

正如您可能看到的,在这种情况下,函数似乎不会执行不区分大小写的搜索.

该功能与Ææ和åå等字符有同样的问题.这些是丹麦人物.

php string-search strpos

6
推荐指数
1
解决办法
5977
查看次数

字符串中的PHP数组值?

我一直在PHP手册中查找一段时间,找不到任何能够满足我想要的命令.

我有一个包含键和值的数组,例如:

$Fields = array("Color"=>"Bl","Taste"=>"Good","Height"=>"Tall");
Run Code Online (Sandbox Code Playgroud)

然后我有一个字符串,例如:

$Headline = "My black coffee is cold";
Run Code Online (Sandbox Code Playgroud)

现在我想知道是否有任何数组($ Fields)值匹配字符串中的某个位置($ Headline).

例:

Array_function_xxx($Headline,$Fields);
Run Code Online (Sandbox Code Playgroud)

将结果设为true,因为"bl"在字符串$ Headline中(作为"Black"的一部分).

我问,因为我需要表现......如果这是不可能的,我会做出自己的功能......

编辑 - 我正在寻找像stristr(string $ haystack,array $ needle);

谢谢

解决方案 - 我想出了他的功能.

function array_in_str($fString, $fArray) {

  $rMatch = array();

  foreach($fArray as $Value) {
    $Pos = stripos($fString,$Value);
    if($Pos !== false)
      // Add whatever information you need
      $rMatch[] = array( "Start"=>$Pos,
                         "End"=>$Pos+strlen($Value)-1,
                         "Value"=>$Value
                       );
  }

  return $rMatch;
}
Run Code Online (Sandbox Code Playgroud)

返回的数组现在具有关于每个匹配的单词的开始和结束位置的信息.

php arrays string-search

5
推荐指数
1
解决办法
9515
查看次数

替换字符串中的重复字符串

我正在尝试在字符串中查找(并替换)重复的字符串.

我的字符串可能如下所示:

Lorem ipsum dolor sit amet sit amet sit amet sit nostrud exercitation amit sit ullamco laboris nisi ut aliquip ex ea commodo consequat.

这应该成为:

Lorem ipsum dolor sit amet sit nostrud exercitation amit sit ullamco laboris nisi ut aliquip ex ea commodo consequat.

请注意,由于没有重复,因此不会删除amit sit.

或者字符串可以是这样的:

Lorem ipsum dolor sit amet()sit amet()sit amet()sit nostrud exercitation ullamco laboris nisi ut aliquip aliquip ex ea commodo consequat.

应成为:

Lorem ipsum dolor sit amet()sit nostrud exercitation ullamco laboris nisi …

php regex perl string-search

5
推荐指数
1
解决办法
2199
查看次数

了解 Baeza-Yates Régnier 算法(多字符串匹配,从 Boyer-Moore 扩展)

首先,如果我写了很多,请原谅,我试图总结我的研究,以便每个人都能理解。

R. Baeza-Yates 和 M. Regnier 于 1990 年发表了一种新算法,用于在二维 n n 文本中搜索二维mm 模式该出版物写得非常好,对于像我这样的新手来说也很容易理解,算法是用伪代码描述的,我能够成功地实现它。

BYR 算法的一部分需要 Aho-Corasick 算法。这允许在字符串文本中搜索多个关键字的出现。然而,他们也说他们的这部分算法可以通过使用 Aho-Corasick 而不是 Commentz-Walter 算法(基于 Boyer-Moore 而不是 Knuth-Morris-Pratt 算法)得到很大的改进。他们唤起了他们自己开发的 Commentz-Walter 算法的替代方案。这在他们之前的出版物中进行描述和解释(见第 4 章)。

这就是我的问题所在。正如我所说,算法会遍历文本并检查它是否包含关键字集中的单词。单词倒置排列并放置在树中。为了提高效率,有时需要跳过一些字母,因为他知道没有找到匹配项。

特里

以确定可以被跳过,两个表中的字符数d,并dd必须被计算出来。那么,算法很简单:

该算法的工作原理如下:

  • 我们将树的根与文本中的位置 m 对齐,然后沿着树中的相应路径从右到左开始匹配文本。
  • 如果找到匹配项(最终节点),我们输出相应字符串的索引。
  • 在匹配或不匹配之后,我们使用与当前节点关联的最大移位(表示 dd)和 d[x] 的值在文本中进一步移动特里树,其中 x 是文本中对应于树根。
  • 在新位置从右到左再次开始匹配树。

我的问题是我不知道如何计算dd函数。在他们的出版物中,R. Baeza-Yates 和 M. Regnier 提出了它的正式定义:

dd 函数

pi 是关键字集合中的一个词,j 是这个词中一个字母的索引,所以 pi[j] 就像我之前展示的树中的一个节点。节点中的数字表示 dd(node)。L 是单词数,mi 是单词 pi 中的字母数。

他们没有给出关于这个函数的构造的说明。他们只推荐观看W. Rytter 的作品。本文档构建了一个与预期类似的函数,不同之处在于在这种情况下,只有一个关键字而不是一个集合。

dd(这里称为D)的定义如下: …

c++ algorithm tree pattern-matching string-search

5
推荐指数
1
解决办法
533
查看次数

Octave - 返回单元格数组中第一次出现字符串的位置

Octave中是否有一个函数返回单元格数组中第一次出现字符串的位置?

我发现findstr但这会返回一个我不想要的矢量.我想要做什么index,但它只适用于字符串.

如果没有这样的功能,有没有关于如何去做的提示?

string matlab octave string-search

5
推荐指数
1
解决办法
1144
查看次数

当第一个子字符串后有空格时,在 Python 中查找两个子字符串之间的字符串

虽然 StackOverflow 上有几篇与此类似的帖子,但它们都没有涉及目标字符串在子字符串之一后一个空格的情况。

我有以下字符串(example_string): <insert_randomletters>[?] I want this string.Reduced<insert_randomletters>

我想提取“我想要这个字符串”。从上面的字符串。随机字母总是会改变,但是引用“我想要这个字符串”。将始终介于[?](最后一个方括号后有一个空格)和 Reduced 之间。

现在,我可以执行以下操作来提取“我想要这个字符串”。

target_quote_object = re.search('[?](.*?)Reduced', example_string)
target_quote_text = target_quote_object.group(1)
print(target_quote_text[2:])
Run Code Online (Sandbox Code Playgroud)

这消除了],并总是出现在我的已提取的字符串,从而只打印的开始:“我想这个字符串。” 但是,这个解决方案看起来很丑,我宁愿re.search()不做任何修改就返回当前的目标字符串。我怎样才能做到这一点?

python regex string substring string-search

5
推荐指数
1
解决办法
1645
查看次数

在大量文件中搜索固定字符串的静态列表

我有很多固定字符串(约500万),我想在很多文件中搜索.

我看到两种最常用的使用有限模式进行字符串搜索的算法是:Aho-CorasickCommentz-Walter.

我的目标是找到完全匹配而不是模式(这意味着字符串列表不是正则表达式).

经过一番研究,我发现了很多的文章,指出Commentz -瓦尔特·往往是在现实世界中的场景(比阿霍Corasick更快的第一条,第二条),而且还落后于算法的GNU的grep.

我试图以grep -F并行方式使用(取自此处):

free=$(awk '/^((Swap)?Cached|MemFree|Buffers):/ { sum += $2 }
          END { print sum }' /proc/meminfo)
percpu=$((free / 200 / $(parallel --number-of-cores)))k
parallel --pipepart -a regexps.txt --block $percpu --compress \
grep -F -f - -n bigfile
Run Code Online (Sandbox Code Playgroud)

似乎问题太大了.我收到此错误:

grep: memory exhausted
Run Code Online (Sandbox Code Playgroud)
  1. 我想过尝试将模式列表拆分成多个文件并为同一个文件运行grep次数 - 但这看起来很笨拙.还有其他解决方案吗?或者我没有以正确的方式运行grep?
  2. 通过运行Commentz-Walter算法,grep应该做一些预处理工作.我假设在两个不同的文件上使用相同的模式文件运行grep将导致grep执行两次相同的预处理阶段.有没有办法在文件列表上运行grep并使其仅运行模式预处理一次?
  3. 在c\c ++中有没有很好的Commentz-Walter实现?我只在python中找到代码(这里)?

---更新---

据一些意见,我试图测试不同的阿霍Corasickç\ C++实现(Komodia,Cjgdev,chasan)他们的非本来管理的500万图案设置的例子(所有的人有记忆问题(分段故障/堆栈溢出)) - …

algorithm grep string-search

5
推荐指数
1
解决办法
216
查看次数

产品名称字符串与树匹配(支持省略)

我有一个 CPU 型号列表。现在,我认为最合适的方法是从列表中形成一个特里,如下所示:

Intel -- Core -- i -- 3
      |       |    |- 5
      |       |    |- 7
      |       |    -- 9
      |       |
      |       -- 2 Duo
      |
      |- Xeon -- ...
      |
      |...
Run Code Online (Sandbox Code Playgroud)

现在,我想将输入字符串与此树进行匹配。这对于精确匹配很容易,但是如果我需要一个模糊的匹配,字符串序列可以有遗漏怎么办?对于“Intel i3”,“Core i3”和“i3”都匹配到树中的“Intel -> Core -> i -> 3”。

对于这个问题,尝试是正确的任务吗?我想过使用带通配符的特里搜索,但这里的通配符可以在序列中的任何位置。

我可以使用什么数据结构以最适用于这个问题的方式来表示列表?我使用什么算法进行搜索?

search string-matching string-search data-structures

5
推荐指数
1
解决办法
58
查看次数

如果 m &lt;= n,时间复杂度 O(nm) 等于 O(n^2)

我正在研究算法的时间复杂度,以查找字符串n是否包含子字符串m(其中m <= n )。分析结果是时间复杂度为O(nm)。因此,以这个时间复杂度为起点,并知道m <= n,因此mn <= n^2。我们可以说大 O 表示法的时间复杂度是O(n^2)吗?

algorithm big-o time-complexity string-search

5
推荐指数
1
解决办法
3325
查看次数

打印与表中的重复输入相对应的不同输出值?

例如,TableA:

     ID1    ID2   
     123    abc
     123    def
     123    ghi
     123    jkl
     123    mno
     456    abc
     456    jkl
Run Code Online (Sandbox Code Playgroud)

我想对123进行字符串搜索并返回所有相应的值.

    pp = Cases[#, x_List /; 
     MemberQ[x, y_String /; 
       StringMatchQ[y, ToString@p, IgnoreCase -> True]], {1}] &@TableA

    {f4@"ID2", f4@pp[[2]]}
Run Code Online (Sandbox Code Playgroud)

上面,p是输入,或123.这只返回ID2的一个值.如何获取ID2的所有值?

wolfram-mathematica duplicates string-search

4
推荐指数
1
解决办法
437
查看次数