1

考虑以下字符串

breaking out a of a simple prison
this is b moving up
following me is x times better

所有字符串都已小写。我想删除任何“松散”的 az 字符,结果是:

breaking out of simple prison
this is moving up
following me is times better

这可能在 php 中使用单个正则表达式吗?

4

5 回答 5

3
$str = "breaking out a of a simple prison
this is b moving up
following me is x times better";
$res = preg_replace("@\\b[a-z]\\b ?@i", "", $str);
echo $res;
于 2012-04-24T21:49:03.953 回答
2

怎么样:

preg_replace('/(^|\s)[a-z](\s|$)/', '$1', $string);

请注意,这也会捕获位于字符串开头或结尾的单个字符,但不会捕获与标点符号相邻的单个字符(它们必须被空格包围)。

如果您还想立即删除标点符号之前的字符(例如“x.”),那么这在大多数(英语)情况下应该可以正常工作:

preg_replace('/(^|\s)[a-z]\b/', '$1', $string);
于 2012-04-24T21:38:41.307 回答
1

你可以尝试这样的事情:

preg_replace('/\b\S\s\b/', "", $subject);

这就是它的意思:

\b    # Assert position at a word boundary
\S    # Match a single character that is a “non-whitespace character”
\s    # Match a single character that is a “whitespace character” (spaces, tabs, and line breaks)
\b    # Assert position at a word boundary

更新

正如Radu提出的,因为我已经使用了\Sthis will match more than just a-zA-Z。它也会匹配0-9_。通常,它会匹配更多,但因为它前面是\b,它只能匹配单词字符。

正如Tim Pietzcker的评论中所提到的,请注意,如果您的主题字符串需要删除后跟非单词字符(如test a (hello). 如果像这样的单个字符后有多余的空格,它也会翻倒

test a  hello 

但您可以通过将表达式更改为\b\S\s*\b

于 2012-04-24T21:40:10.810 回答
1

作为一个单行:

$result = preg_replace('/\s\p{Ll}\b|\b\p{Ll}\s/u', '', $subject);

这匹配单个小写字母 ( \p{Ll}),它前面或后面是空格 ( \s),同时删除两者。单词边界 ( \b) 确保只有单个字母确实匹配。/u修饰符使正则表达式能够识别 Unicode 。

结果:两边被空格包围的单个字母被缩减为一个空格。前面有空格但后面没有空格的单个字母将被完全删除,就像后面只有一个字母但前面没有空格一样。

所以

This a is my test sentence a. o How funny (what a coincidence a) this is!

改为

This is my test sentence. How funny (what coincidence) this is!
于 2012-04-24T21:59:07.113 回答
0

试试这个:

$sString = preg_replace("@\b[a-z]{1}\b@m", ' ', $sString);
于 2012-04-24T21:42:02.713 回答