1

我有一个包含 5 个单词的字符串。在字符串中,其中一个词是业余无线电呼号,可以是美国数千个呼号中的任何一个。为了从字符串中提取呼号,我需要使用以下模式。我需要提取的呼号可以位于字符串中的 5 个位置中的任何一个。数字永远不是第一个字符,数字永远不是最后一个字符。该字符串实际上是从一个数组中组合在一起的,因为它最初是从一个文本文件中读取的。

$string = $word[1] $word[2] $word[3] etc.... 

所以搜索可以在整个字符串或数组的每一块上完成。

Patterns:
1 Number and 3 Letters Example: AB4C A4BC
1 Number and 4 Letters Example: A4BCD
1 Number and 5 Letters Example: AB4CDE

我已经尝试了所有我能想到和搜索的东西,直到我无法再搜索。我确定我想太多了。

4

2 回答 2

0

这取决于其他单词可以包含的内容,但您可以使用正则表达式,例如:

#\b[a-z]+\d[a-z]+\b#i
                    ^ case insensitive
                 ^^ a word boundary
           ^^^^^^ One or more letters
         ^^ One number

{1,3}您可以通过使用而不是for 字母来使其更具限制性,+以便您拥有 1 到 3 个字母的序列。

完整的表达式类似于:

$success = preg_match('#\b[a-z]+\d[a-z]+\b#i', $input_string, $matches);

where$matches[0]将包含匹配的值,请参阅手册

于 2012-08-18T23:20:58.193 回答
0

像这样的两步正则表达式可以做到这一点:

$str = "hello A4AB there BC5AD";
$signs = array();
preg_match_all('/[A-Z][A-Z\d]{1,3}[A-Z]/', $str, $possible_signs);
foreach($possible_signs[0] as $possible_sign)
    if (preg_match('/^\D+\d\D+$/', $possible_sign))
        array_push($signs, $possible_sign);

print_r($signs); //Array ([0] => A4AB [1] => BC5AD)

解释

这是一种正则表达式方法,使用两种模式。我不认为它可以用一个来完成,并且仍然满足匹配规则的确切要求。

第一个模式强制执行以下要求:

  • 子字符串以大写字母开头和结尾
  • substring 仅包含第一个和最后一个字母之间的其他大写字母或数字
  • 总体而言,子字符串的长度不超过 6 个字符

由于复杂的 REGEX 原因,我不能以同样的模式做(除非有人知道一种方法并且可以纠正我),强制只包含一个数字。

@jeroen 的答案确实以单一模式强制执行此操作,但反过来又不强制执行子字符串的正确长度。无论哪种方式,我们都需要第二种模式。

因此,在获取初始匹配后,我们循环遍历结果。然后,我们将每个应用到第二个模式,该模式简单地强制子字符串中只有一个数字。

如果是这样,我们将子字符串点亮并将其添加到$signs数组中。

希望这可以帮助。

于 2012-08-18T23:25:31.257 回答