2013-03-27 4 views
2

мне нужно, чтобы соответствовать следующим образом:Regex - как совместить границу символа без слов?

-foo 
foo- 

Но я не хочу, чтобы соответствовать foo-bar.

Я не могу использовать \b, поскольку это не соответствует границе дефиса. Моя цель - заменить дефис пространством. Предложения?

UPDATE 1 (лучший пример):

xxx yyy -foo foo- foo-bar zzz 

Я заинтересован только в строках -foo и foo-. Идея состоит в том, чтобы удалить эти дефисы. Дефисы - это переносы слов. Значит, должно быть слово слева и справа. Если это не так, то дефисс не должен появляться.

+0

Вам понадобится более конкретная информация о том, что вы хотите принять и что хотите отклонить. Кроме того, '\ b' соответствует только границе слова, поэтому я могу предположить, что вы хотите использовать его как часть более крупного шаблона. Какова более крупная модель? –

+0

Я пытался увидеть, могу ли я использовать '\ b' для соответствия началу дефиса. Нет. Мне просто нужно сопоставить строки, начинающиеся с дефиса ИЛИ заканчивается дефисом. – StackOverflowNewbie

+1

Это довольно просто, и беспокоиться о границах слов - это просто оскорбление вещей. Вы должны были сказать так много изначально! –

ответ

1

Раствор с отрицательного предпросмотра и просмотра назад:

$string = 'xxx yyy -removethis andthis- foo-bar zzz -andalsothis-'; 
$new_string = preg_replace('/(?<!\w)-(\w+)-(?!\w)|(?<!\w)-(\w+)|(\w+)-(?!\w)/', '$1$2$3', $string); 
echo $new_string; // Output: xxx yyy removethis andthis foo-bar zzz andalsothis 

/* 
    (?<!\w) : Check if there is a \w behind, if there is a \w then don't match. 
    (?!\w) : Check if there is a \w ahead, if there is a \w then don't match. 
    \w : Any word character (letter, number, underscore) 
*/ 

Online demo.

0

Мое решение: ^-|-$| -|-

Match either the regular expression below (attempting the next alternative only if this one fails) «^-» 
    Assert position at the beginning of the string «^» 
    Match the character “-” literally «-» 
Or match regular expression number 2 below (attempting the next alternative only if this one fails) «-$» 
    Match the character “-” literally «-» 
    Assert position at the end of the string (or before the line break at the end of the string, if any) «$» 
Or match regular expression number 3 below (attempting the next alternative only if this one fails) « -» 
    Match the characters “ -” literally « -» 
Or match regular expression number 4 below (the entire match attempt fails if this one fails to match) «- » 
    Match the characters “- ” literally «- » 
Смежные вопросы