我想用一个空格替换额外的空格(连续空白字符的实例),只要这些额外的空格不在双引号或单引号(或我可能想要包括的任何其他附件)中。
我看到了一些类似的问题,但在上面找不到直接满足我需求的答案。谢谢!
最佳答案
希望您还在寻找,或回来查看!这似乎对我有用:
'/\s+((["\']).*?(?=\2)\2)|\s\s+/'
...并替换为 $1
编辑
此外,如果您需要允许转义引号,例如 \"
或 \'
,您可以使用此表达式:
'/\s+((["\'])(\\\\\2|(?!\2).)*?(?=\2)\2)|\s\s+/'
如果您想添加对“平衡”引号(例如方括号)的支持(例如 ()
或 {}
)
结束编辑
如果您发现问题或需要一些解释,请告诉我!
希望是最终编辑和警告
- 潜在问题:如果带引号的字符串从字符串变量(或文件)的开头开始,它要么不算作带引号的字符串(并减少了任何空格),要么会丢掉整个东西,使任何东西NOT 在引号中被视为好像在引号中,反之亦然 -
- 可能解决这个问题的潜在更改是使用以下匹配表达式
/(?:^|\s+)((["\'])(\\\\\2|(?!\2).)*?(?=\2)\2) |\s\s+/
- 这会将表达式开头的
\s+
替换为(?:^|\s+)
- 这将在变量的开头添加一个空格如果字符串以引号开头 - 只需 trim() 或删除该空格以继续
- 我似乎使用了“逐行”方法(如 sed,如果我没记错的话)来达到我的原始结果 - 如果您使用“整个文件”或“整个字符串”设置或方法,回车-return-line-feed 似乎算作两个空白字符(无法想象为什么......),从而将任何换行符变成单个空格(除非它们在引号内并且使用“点匹配换行符”,当然)
- 这可以通过将
.
和\s
速记字符类替换为您要匹配的特定字符来解决,如下所示: /(?:^|[\t]+)((["\'])(\\\\\2|(?!\2)[\s\S])*?( ?=\2)\2)|[\t]{2,}/
- 这不需要 dot-matches-newline 开关,只替换多个空格或制表符 - 不是换行符 - 用一个空格(当然,只有当他们没有被引用)
- 这可以通过将
示例
This link显示了在 http://codepad.viper-7.com 上的示例文本中使用的第一个表达式和最后一个表达式的示例
关于php - 字符串中的正则表达式额外空格不在双引号或单引号中 - PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10074512/