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

Joe*_*Joe 7 php regex

我需要一个正则表达式来删除字符串中的所有单个字符,而不仅仅是单个字母或数字

字符串是:

"未来Ft赌场空手道斩(地铁产品)"

它应该是:

"未来Ft赌场空手道Chop Prod By Metro"

我现在使用的表达式(在PHP中)正确地删除了单个'A'但是留下了单个'('和')'

这是我正在使用的代码:

$string = preg_replace('/\b\w\b\s?/', '', $string); 
Run Code Online (Sandbox Code Playgroud)

Nic*_*ick 13

试试这个:

(^| ).( |$)
Run Code Online (Sandbox Code Playgroud)

分解:

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

实际代码:

$string = preg_replace('/(^| ).( |$)/', '$1', $string); 
Run Code Online (Sandbox Code Playgroud)

注意:我不熟悉PHP正则表达式的工作原理,因此代码可能需要稍微调整一下,具体取决于实际的正则表达式需求的声明方式.

正如m.buettner所指出的,这里有一个尾随的空白区域.需要一个修剪来清除它.

编辑:Arnis Juraga指出,这不会清除多个单个字符a b c会过滤掉b.如果这是一个问题,请使用此正则表达式:

(^| ).(( ).)*( |$)
Run Code Online (Sandbox Code Playgroud)

(( ).)*添加到中间会查找任意字符0次或更多次以下的任何空间.不利的一面是,最终会出现一系列单个字符所在的双倍空格.

这意味着:

The a b c dog
Run Code Online (Sandbox Code Playgroud)

会变成这样的:

The  dog
Run Code Online (Sandbox Code Playgroud)

在执行替换以获取单个单个字符后,您需要使用以下正则表达式来定位双空格,然后用单个空格替换

( ){2}
Run Code Online (Sandbox Code Playgroud)

  • @ user1810833只需在替换参数中放置`$ 1 $ 2`或`$ 1`就可以轻松解决这个问题. (3认同)
  • @AyeshK然后它不会删除`(`或``),他说任何字符,特别是不是任何字母或数字. (2认同)
  • @Nick +1,简单明了的答案.你可能应该提一下警告,如果最后一个字符是单个字符,这将留下一个尾随空格. (2认同)

Mar*_*der 6

一个稍微更高效的版本,不需要捕获将使用lookarounds.由于多重否定逻辑,它不太直观:

$string = preg_replace('/(?<!\S).(?!\S)\s*/', '', $input);
Run Code Online (Sandbox Code Playgroud)

这将删除任何前面后面没有空白字符的字符(因此只有那些在空格之间或字符串边界处的字符).它还将包括匹配中的所有尾随空格,以便只留下前面的空格(如果有的话).需要注意的是,就像Nick的回答一样),字符串末尾会留下一个尾随空格(因为它位于字符前面).这可以通过trimming字符串轻松解决.