正则表达式仅捕获某些字符

时间:2017-10-19 16:10:15

标签: php regex

目前正在处理一些问题。这是我的字符串“all-days” 我需要一些帮助来创建一个正则表达式来捕获第一个字符,短划线以及短划线后的第一个字符。我是Regex的新手,请原谅我。

这是我到目前为止所得到的。 (^)。

4 个答案:

答案 0 :(得分:1)

  

捕获第一个字符,破折号以及第一个   短划线后的字符

使用preg_match功能:

$s = "all-days";
preg_match('/^(.)[^-]*(-)(.)/', $s, $m);
unset($m[0]);

print_r($m);

输出:

Array
(
    [1] => a
    [2] => -
    [3] => d
)

答案 1 :(得分:1)

它不是正则表达式但是如果您只想通过其他方式获得解决方案,可以通过explodearray_walkimplode

$string = 'all-days-with-my-style';
$arr = explode("-",$string);
$new = array_walk($arr,function(&$a){
 $a  = $a[0];
});
echo implode("-",$arr);

现场演示:https://eval.in/882846

输出为:a-d-w-m-s

答案 2 :(得分:0)

代码

See code in use here

\b(\w|-\b)

为了获得更高的精度,可以使用以下内容(请注意,它使用的是Unicode组,因此它不适用于所有语言,但它适用于PHP)。这只会匹配字母,而不是数字和下划线。它使用负面的lookbehind和积极的前瞻,但是你可以理解它,如果你继续阅读这篇文章,并将其分开一次。

(\b\p{L}|(?<=\p{L})-(?=\p{L}))

说明

  • \b在字边界处断言位置
  • (\w|-\b)将以下内容捕获到捕获组1中
    • \w匹配任何单词字符
    • |
    • -字面上匹配-字符
    • \b在字边界处断言位置

\b

  • 断言字符串中的位置匹配以下内容之一:
    • ^\w断言字符串开头的位置并匹配单词字符
    • \w$匹配单词字符并断言其位置为字符串
    • 中的最后一个位置
    • \W\w匹配任何非单词字符,后跟单词字符
    • \w\W匹配任何单词字符,后跟非单词字符

\w

  • 表示单词字符(通常由集合a-zA-Z0-9_中的任何字符定义),但是,某些语言也接受表示任何字母,数字或下划线的Unicode字符{{1} })。
  • 有关更多精度(取决于用例),您可以指定\p{L}\p{N}_(对于ASCII字母),[a-zA-Z]表示Unicode字母或{{1}带有\p{L}标志的ASCII字符,并在正则表达式中启用不区分大小写的标志。

答案 3 :(得分:0)

我假设你的字符串只包含单词字符和连字符,并且没有连续的连字符:

要删除所有不是连字符的第一个字符及其后的第一个字符,请删除不在字边界之后的所有字符:

$result = preg_replace('~\B\w+~', '', 'all-days');

如果您只想匹配这些字符,只需在字边界后捕捉每个字符:

if ( preg_match_all('~\b.~', 'all-days', $matches) )
    print_r($matches[0]);