正则表达式匹配带连字符的单词

时间:2011-09-02 06:52:58

标签: php regex

如何从此字符串行中提取带连字符的字符串?

ADW-CFS-WE CI SLA Def否SLANAME CI最大停机服务

我只是想从中提取“ADW-CFS-WE”,但在过去的几个小时里一直很不成功。我坚持使用这个简单的regEx“(。*)”使所有字符串都被选中。

4 个答案:

答案 0 :(得分:17)

您可以使用:

preg_match("/\w+(-\w+)+/", ...)

\w+将匹配任意数量的字母数字字符(=一个字)。第二组( )是带字母的任何附加连字符数。

正则表达式的技巧通常是特异性的。使用.*通常会匹配太多。

答案 1 :(得分:1)

$input = "ADW-CFS-WE X-Y CI SLA Def No SLANAME CI Max Outage Service";
preg_match_all('/[A-Z]+-[A-Z-]+/', $input, $matches);
foreach ($matches[0] as $m) {
  echo $matches . "\n";
}

请注意,此解决方案假设只有大写的A-Z才能匹配。如果不是这种情况,请插入正确的字符类。例如,如果您想允许任意字母(例如a和Ä),请将[A-Z]替换为\p{L}

答案 2 :(得分:0)

用至少一个' - '来捕捉每个空格[^ \ s]的单词。

以下表达式将执行此操作:

<?php

$z = "ADW-CFS-WE CI SLA Def No SLANAME CI Max Outage Service";

$r = preg_match('#([^\s]*-[^\s]*)#', $z, $matches);
var_dump($matches);

答案 3 :(得分:0)

以下模式假设数据位于字符串的开头,仅包含大写字母,并且在每组中包含一个或多个字母之前可能包含连字符:

    <?php
    $str = 'ADW-CFS-WE CI SLA Def No SLANAME CI Max Outage Service';
    if (preg_match('/^(?:-?[A-Z]+)+/', $str, $matches) !== false)
        var_dump($matches);

结果:

    array(1) {
      [0]=>
      string(10) "ADW-CFS-WE"
    }