RegEx для добавления пробела в специальном шаблоне - PullRequest
1 голос
/ 26 мая 2019

Краткое примечание: Я знаю, что анализаторы уценки не заботятся об этой проблеме.Это ради визуальной согласованности в файле md, а также экспериментов.

Образец :

# this
##that
###or this other

Цель : прочитать каждую строку и, если заголовок уценки не имеет пробела после знака фунта / хэштега, добавьте его так, чтобы он выглядел так:

# 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, если это имеет значение).

Ответы [ 2 ]

2 голосов
/ 26 мая 2019

Попробуйте сопоставить (?m)^#++\K\S, что соответствует строкам, начинающимся с одного или нескольких числовых знаков, затем замените его на $0 в вашей функции:

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

См. живая демонстрация здесь

Чтобы ограничить число # с до шести, используйте:

(?m)^(?!#{7})#++\K\S
1 голос
/ 26 мая 2019

Я предполагаю, что здесь может работать простое выражение с правой границей списка символов, возможно:

(#)([a-z])

Если у нас может быть больше символов, мы можем просто добавить его к [a-z].

enter image description here

Демо

Тест

$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;
...