查找以相同顺序以预定义字母开头的单词的短语

时间:2013-08-19 11:33:50

标签: php regex algorithm search

我有一段非常长的文本$text,这是一组普通的英语句子(例如博客上的文章)

我有一些保留字母的数组

$reserved=array("L", "N", "C");

我有一系列免费字母,例如

$free=array("A", "E", "I", "O", "U");

如何找到本文中包含以$reserved字母开头的单词的所有短语,其顺序与它们在数组中的顺序相同,但可能有也可能没有$free中字母开头的单词1}}数组。

最终预期的正确结果

  1. 让我们不作弊(它有L,N,C的顺序与$reserved数组相同,U出现在$ free数组中)
  2. 失去了我们的海军和我们所有的指挥官("它再次具有L,N和C的顺序与$reserved数组相同,其中来自free数组的O,A,O
  3. 让挪威变冷(L,N,C与$reserved数组中的顺序相同,但free数组中没有带字母的单词)
  4. 结果不正确

    1. 不要欺骗我们的邻居(L,N C找到但是在$reserved数组只有3个保留字母表时找到了额外的N)
    2. 不要欺骗我们的朋友(F不在$free$reserved数组中)
    3. 来看看我的车(L,N,C与$reserved阵列中的顺序不一样)
    4. 我知道我可以在循环中逐个查看单词,然后循环遍历所有必需的字母表和可选字母表,但我认为这将是一种非常耗时且低效的查找单词的方法。我正在寻找更有效的方法来解决它......或许有一些正则表达式魔法或类似的东西。

      你们能否就我应该采取什么方法解决这个问题给我一些指示?

      我知道正则表达式,PHP和JS,但如果可以用任何语言建议解决方案,那就没问题了。

2 个答案:

答案 0 :(得分:0)

我认为一个简单的循环没有错。

也就是说,你可以提取单词的起始字母,大写生成的字符串(例如:LUNC),然后将其与'^[AEIOU]*L[AEIOU]*N[AEIOU]*C[AEIOU]*$'匹配。生成此表达式很容易。不过,我不确定这是值得的努力......你最终会得到一个更丑陋的代码。

答案 1 :(得分:0)

如上所述,您可以使用循环。你提到了使用正则表达式的可能性,所以我写了一个只是为了涵盖所有基础 - 对我有用的是:

/^([aeiou]\w+\s?)*L\w+ ([aeiou]\w+\s?)*N\w+ ([aeiou]\w+\s?)*C\w+$/gim

RegExr

像上面这样的正则表达式可以用PHP自动生成,不过你是否想要复杂的东西是另一回事!正如你提到的正则表达式的可能性,我认为你还是希望看到它。