我需要匹配以下内容:
-foo
foo-
但我不想匹配foo-bar
。
我无法使用\b
,因为它与连字符的边界不匹配。我的目标是用空格替换连字符。建议?
更新1 (更好的例子):
xxx yyy -foo foo- foo-bar zzz
我只对字符串-foo
和foo-
感兴趣。想法是删除那些连字符。连字符用于连字。意思是,左右应该有一个词。如果没有,则不应出现连字符。
答案 0 :(得分: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)
*/
答案 1 :(得分: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 «- »