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


Regular expression to match hyphenated words

如何从这个字符串行提取连字符字符串?

ADW-CFS-WE CI SLA Def No SLANAME CI最大宕机服务

我只是想从中提取"ADW-CFS-WE",但在过去的几个小时里一直没有成功。我被这个简单的regEx "(.*)"卡住了,使得所有的字符串都被选中了。

您可以使用:

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

'w+将匹配任意数量的字母数字字符(=一个单词)。第二组( )是任意数目的连字符。

正则表达式的技巧通常是专一性。使用.*往往会匹配太多。
$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}

捕捉每一个至少有一个'-'的空格[^'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);

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

    <?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"
    }