正则表达式:从字符串中移除所有单个字符

7
我需要一个正则表达式来从字符串中删除所有单个字符,不仅仅是单个字母或数字。
字符串为:
"A Future Ft Casino Karate Chop ( Prod By Metro )"
输出应该是:
"Future Ft Casino Karate Chop Prod By Metro"
我目前使用的表达式(在PHP中),可以正确地删除单个的 'A',但保留了单个的 '(' 和 ')'。
这是我现在使用的代码:
$string = preg_replace('/\b\w\b\s?/', '', $string); 

1
解释一下:\b 只会匹配 \w\W 之间的边界。由于 <space>( 匹配 \W,它们之间没有边界。评论只能在 5 分钟内编辑(点击此框以关闭)。 - cmbuckley
非常感谢您的快速回复和解释。总之,$string = preg_replace('/(^| ).( |$)/', '$1', $string); 对我所需的功能完美地起作用。 - Joe
2个回答

14

试试这个:

(^| ).( |$)

故障:

   1.  (^| )  ->  Beginning of line or space  
   2.  .      ->  Any character  
   3.  ( |$)  ->  Space or End of line

实际代码:

$string = preg_replace('/(^| ).( |$)/', '$1', $string); 

注意:我不熟悉PHP正则表达式的工作原理,因此代码可能需要进行微调,具体取决于实际的正则表达式需要如何声明。

正如m.buettner指出的那样,这段代码会在这里留下一个尾随的空格。需要使用trim来清除它。

编辑:Arnis Juraga指出,这将无法清除多个单字符 a b c 将过滤为 b。如果这是一个问题,请使用这个正则表达式:

(^| ).(( ).)*( |$)

(( ).)*在中间添加将查找任何空格,后跟0个或多个字符。缺点是当一系列单个字符位于此位置时,会出现双倍空格。

意思是:

The a b c dog

将变成这样:

The  dog

将字符串替换为单个字符后,您需要使用以下正则表达式来定位双空格,并将其替换为单个空格。

( ){2}

@user1810833 还缺什么?为什么只是关闭? - Nick
2
@AyeshK 如果这样做,它就不会删除 (),他说任何字符,特别是不仅仅是字母或数字。 - Nick
3
只需要在替换参数中简单地放置“$1$2”或“$1”,就可以轻松解决这个问题。 - Daedalus
2
@Nick +1,回答简洁明了。不过你可能需要提一下警告,如果最后一个字符是单个字符,这将留下尾随空格。 - Martin Ender
1
这不会删除连续的单个字符,例如:"a b c" 将被转换为 "b"。 - Arnis Juraga
显示剩余5条评论

6

一种更高效的版本是使用环视而不需要捕获。由于涉及到多个否定逻辑,这种方法可能不太直观:

$string = preg_replace('/(?<!\S).(?!\S)\s*/', '', $input);

这段代码可以去除任何一个前后都跟着非空格字符的字符(仅包括在空白处或在字符串边界的字符)。它还将包括所有尾随的空格在匹配中,这样就只会留下前面的空格。不过需要注意的是,就像Nick's答案一样,字符串末尾的)会留下一个尾随的空格(因为它在字符之前),这可以轻松通过对字符串进行trim来解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接