-1

我有一段很长的文本$text,它是正常英语句子的集合(例如博客中的一篇文章)

我有一些保留字母的数组

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

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

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

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

最终预期的正确结果

  1. 让我们不要作弊(它的 L、N、C 与数组中的顺序相同,$reserved并且 U 存在于 $free 数组中)
  2. 失去了我们的海军和我们所有的指挥官(“它的 L、N 和 C 的顺序与$reserved阵列中的 O、A、O 的free排列顺序相同)
  3. 离开挪威冷藏(L、N、C 的顺序与数组中的顺序相同,$reserved数组中没有包含字母的单词free

结果不正确

  1. 让我们不要欺骗我们的邻居(找到 L、NC,但发现额外的 N,而$reserved数组只有 3 个保留字母)
  2. 让我们不要欺骗我们的朋友(F 不在$freeor$reserved数组中)
  3. 来看看我的车(L、N、C 与$reserved数组中的顺序不同)

我知道我可以一次一个地遍历单词,然后遍历所有必需的字母表和可选的字母表,但我认为这将是一种非常耗时且效率低下的查找单词的方法。我正在寻找更有效的方法来解决它......也许有一些正则表达式魔法或类似的东西。

你们能给我一些关于我应该用什么方法来解决这个问题的指示吗?

我知道正则表达式、PHP 和 JS,但如果可以用任何语言提出解决方案,我也可以。

4

2 回答 2

0

我认为一个简单的循环没有任何问题。

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

于 2013-08-19T12:13:48.047 回答
0

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

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

正则表达式

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

于 2013-08-19T12:23:04.970 回答