我只需删除特定字符之间的一些空格。 这是我的数据:
#1 2 5 1#
# 5 5 3#: 100% #5 55#
#554 #: 23
#559#: 30%
#4 79#: 2 0 0#%
#473#: 20 #47 4#
#4 7 4 43 33 5 5#: 15s
#4 79#: 195%
#473#: 20 # 474#
#475#: 14.5s
我想要删除两个##标签之间的所有空格,这些空格不会被除数字以外的任何内容分隔开。 我的数据应如下所示:
#1251#
#553#: 100% #555#
#554#: 23
#559#: 30%
#479#: 2 0 0#%
#473#: 20 #474#
#474433355#: 15s
#479#: 195%
#473#: 20 #474#
#475#: 14.5s
我目前正在尝试在PHP中使用以下正则表达式来preg_replace那些空格,但是,我尝试过的所有内容都不成功。
(?:[#])(?:([\s])*[0-9]*)*(?:[#])
答案 0 :(得分:3)
此正则表达式针对您想要的所有空间。您可以preg_replace
使用空字符串。
(?:#|\G)\d*\K\s+(?=[\d\s]*#)
请参阅demo
作为第二种选择,由于您的行似乎是从#
开始,为了避免#
之间的不平衡,您还可以使用:
(?m)(?:^#|\G)\d*\K\s+(?=[\d\s]*#)
<强>解释强>
(?:#|\G)\d*\K\s+(?=[\d\s]*#)
(?:#|\G)
下面的正则表达式
#
#
\G
\G
\d*
*
\K
\s+
+
(?=[\d\s]*#)
[\d\s]*
*
\d
\s
#
答案 1 :(得分:1)
您可以将preg_replace_callback()
与以下正则表达式一起使用:
/^#.*?#:?/m
用简单的英语:断言字符串开头的位置,匹配单个#
字符,后跟除换行符之外的任何字符,直到下一个#
,尽可能匹配(懒惰匹配) 。然后匹配:
(如果找到)。 m
修饰符用于启用多行匹配。
基本上,表达式匹配第一个#
和第二个#
之间的所有内容。找到匹配后,会将其传递给回调函数,其中使用str_replace()
删除所有空格。
preg_replace_callback('/^#.*?#:?/m', function ($matches) {
return str_replace(' ', '', $matches[0]);
}, $text);