【问题标题】:RegEx for adding a space in a special pattern用于以特殊模式添加空格的正则表达式
【发布时间】:2019-05-25 21:19:06
【问题描述】:

快速说明: 我知道 Markdown 解析器不关心这个问题。这是为了 md 文件的视觉一致性和实验。

示例

# this
##that
###or this other

目标:读取每一行,如果 Markdown 标题在井号/井号符号后没有空格,则添加一个,使其看起来像:

# this
## that
### or this other

我的非正则表达式尝试:

function inelegantFunction (string $string){
    $array = explode('#',$string);
    $num = count($array);
    $text = end($array);
    return str_repeat('#', $num-1)." ".$text;
}

echo inelegantFunction("###or this other"); 
// returns  ### or this other

这可行,但它没有机制来匹配不太可能的七个“#”。

不管效果如何,我想弄清楚如何在 php 中使用正则表达式(如果重要的话,也许还有 javascript)。

【问题讨论】:

  • 所以您基本上是在检查^#+\S 并想在那里添加一个空格?
  • 也许preg_replace('~^#+(?![ #])~m', '$0 ', $s) (demo) 可以。在 JS 中,s.replace(/^#+(?![ #])/mg, '$& ') (demo)。
  • 怀疑是的。我尝试过的是 '/#(?[^\s#]+)/' 但是,使用正则表达式,我总是在黑暗中导航,希望能做得更好。
  • 如果# 在您的输入中始终后跟一个单词字符:搜索^#+\K\b 并替换为空格。将+ 替换为例如{1,6} 以获得限制。

标签: php regex pcre regex-lookarounds regex-group


【解决方案1】:

尝试匹配(?m)^#++\K\S,它匹配以一个或多个数字符号开头的行,然后在您的函数中将其替换为 $0

return preg_replace('~(?m)^#++\K\S~', ' $0', $string);

live demo here

#s 的数量限制为六个使用:

(?m)^(?!#{7})#++\K\S

【讨论】:

  • 这很有帮助,谢谢。我不知道 \K 重置选项。尽管在降价文件中根本不可能,但有什么可以确保忽略 10 # 吗?本质上只检查最多 6 个#
【解决方案2】:

我猜测一个带有正确字符列表边界的简单表达式可能在这里工作,也许:

(#)([a-z])

如果我们可能有更多字符,我们可以简单地将其添加到 [a-z]

Demo

测试

$re = '/(#)([a-z])/m';
$str = '#this
##that
###that
### or this other';
$subst = '$1 $2';

$result = preg_replace($re, $subst, $str);

echo "The result of the substitution is ".$result;

【讨论】:

  • 非常感谢。这是一个非常优雅的答案。非常感谢。
猜你喜欢
  • 2019-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-10
相关资源
最近更新 更多