REGEX:如何匹配后跟空格并包含特定字符/符号的字符串

时间:2018-07-14 20:45:06

标签: php regex

我有以下字符串

string string#string#string string
string$string (string) string string string
string string#gulaen#string string-stringan 
(string) string#string#string$string string string (string)
string string string$string#string$string#string string
string string#string$string#string string
string#string$string#string string

使用这种模式/\b(\w+[\#\$])\w+\b/,我尝试匹配后跟空格,包含#和$的字符串,但是我无法获得想要的结果。我得到以下结果

enter image description here

我希望与以下突出显示的蓝色相匹配:

enter image description here

如何实现?谢谢

1 个答案:

答案 0 :(得分:3)

您可以创建一个与特殊符号和1个以上的字符字符匹配的组,并用+对其进行量化:

/\b\w+(?:[#$]\w+)+\b/

请参见regex demo

模式匹配:

  • \b-单词边界
  • \w+-1个以上的字符字符
  • (?:[#$]\w+)+-一个非捕获组,它匹配1个或多个连续出现的#$字符,后跟1个以上的字符字符
  • \b-单词边界。

请参见PHP demo

echo preg_replace('/\b\w+(?:[#$]\w+)+\b/u', '<span>$0</span>', $str);

所讨论的$str的输出:

string <span>string#string#string</span> string
<span>string$string</span> (string) string string string
string <span>string#gulaen#string</span> string-stringan 
(string) <span>string#string#string$string</span> string string (string)
string string <span>string$string#string$string#string</span> string
string <span>string#string$string#string</span> string
<span>string#string$string#string</span> string

Matching code demo

if (preg_match_all('/\b\w+(?:[#$]\w+)+\b/u', $str, $m)) {
    print_r($m[0]);
}

输出:

Array
(
    [0] => string#string#string
    [1] => string$string
    [2] => string#gulaen#string
    [3] => string#string#string$string
    [4] => string$string#string$string#string
    [5] => string#string$string#string
    [6] => string#string$string#string
)