【问题标题】:Finding words in between other words在其他单词之间查找单词
【发布时间】:2015-11-19 08:42:51
【问题描述】:

我有一个单词长度不一的句子。下面句子中的 x 代表随机词,x1、x2 和 x3 代表固定词——不会改变的词。基本上,x1 是 x1,x2 是 x2,x3 是 x3。首先,我需要检查 x1、x2 和 x3 之间是否有 x。如果它们之间有 x,我需要 x 的值。而已。我该怎么做?

x x1 x x2 x3 x

P.S x1、x2、x3之间可以多出1个x,左右也可以多出1个x。

【问题讨论】:

  • 来几个真实的例子怎么样? x 可能是数字、字母、字母数字、UTF-8 等。您尝试过什么?
  • 您也想检索 x 的外部吗?这将与您的问题的标题相矛盾。
  • @jessica 为您的问题添加了 [regex] 标签。请提供更多详细信息: 输入样本;中间会不会有不同的词?您是否需要每个可能出现的不同单词,或者只允许在“固定”单词之间出现一系列重复单词。如何处理x1之前的前词和x3之后的词?你的具体任务是什么?

标签: php regex string contain


【解决方案1】:
preg_match_all('/x1\\s+(.+?)\\s+x2\\s+(.+?)\\s+x3/i', $string, $matches);

会将您想要的内容放入 $matches[1](x1 和 x2 之间的匹配)和 $matches[2](x2 和 x3 之间的匹配)中。正则表达式搜索所有出现的 x1,后跟空格,其他内容,空格,然后 x2,另一个 whitespace-anything-whitespace-sequence,最后是 x3。

如果您希望将中间的字符串作为单独的单词,您可以对它们执行 preg_split('/\s/', ...) 。上面的正则表达式也可以适应这种情况,但这会使检索更加复杂。

例子:

<?php

$string = 'The quick brown fox jumps over the lazy dog';
preg_match_all('/quick\\s+(.+?)\\s+fox\\s+(.+?)\\s+lazy/', $string, $matches);
var_dump($matches);

?>

产量

array(3) {
  [0]=>
  array(1) {
    [0]=>
    string(35) "quick brown fox jumps over the lazy"
  }
  [1]=>
  array(1) {
    [0]=>
    string(5) "brown"
  }
  [2]=>
  array(1) {
    [0]=>
    string(14) "jumps over the"
  }
}

这是正确的结果。

如您所见,$matches[1][0] 包含 quick(或 x1)和 fox(或 x2)之间的单词,$matches[2][0] 包含 fox(或 x2)之间的单词和懒惰(或x3)。如果发现更多的出现,它们将存储在 $matches[1][1] 和 $matches[2][1] 等下,计算第二个索引。遍历 $matches[0] 的索引就足够了,因为所有结果集都将包含完整匹配和两个部分匹配。

【讨论】:

  • 什么是 $matches?数组?它会把它放在 $matches[2] 中? $matches 的索引为 2?为什么索引为 2 而不是 0?
  • 请解释这中间的所有波浪形符号:/(x1|x2|x3)\s+(.*?)\s+(x1|x2|x3)/
  • 查看php.net/manual/en/function.preg-match-all.php 和 PREG_PATTERN_ORDER:第二个带括号的子模式找到的所有匹配项都将包含在 $matches[2] 中。
  • 你知道 x 必须在 x1 x2 和 x3 之间,对吧?它不能在其他任何地方。
  • 所以只有x1 x x2x1 x x3x2 x x3 是不够的?还是x2 x x1 等?
猜你喜欢
  • 2016-03-09
  • 1970-01-01
  • 2020-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 2016-06-15
相关资源
最近更新 更多