我一直在努力解决我希望用正则表达式解决的问题.
假设我有一个字符串,可以包含任何字母数字,并且子字符串可能被方括号包围.这些子字符串可以像这样出现在字符串中的任何位置.也可以有任意数量的括号子串.
例子:
您可以看到某些括号中的子串中有空格,这很好.我现在的主要问题是当我遇到括号外的空格时,如下所示:
现在我想保留括号内的空格,但在其他地方删除它们.
对于像以下字符串来说,这会变得有点棘手:
在这里,我希望返回:
我现在花了一些时间阅读不同的reg ex页面关于lookarounds,负面断言等等,这让我头晕目眩.
注意:对于访问此文件的任何人,我并不是在寻找任何涉及嵌套括号的解决方案.如果是这种情况,我可能会像下面提到的一些评论一样务实.
Sen*_*ful 11
这个正则表达式应该做的伎俩:
[ ](?=[^\]]*?(?:\[|$))
Run Code Online (Sandbox Code Playgroud)
只需替换与""匹配的空格即可.
基本上它所做的只是确保你要移除的空间在它前面有一个"[",但如果它前面有一个"]"则没有.
只要您没有嵌套的方括号,这应该可以工作,例如:
aa [b [cc] b]
因为在这种情况下,第一个"b"之后的空格将被删除,它将变为:
AA [B [CC] B]
这听起来不像你真正想要的正则表达式.通过阅读直接解析非常容易.伪代码:
inside_brackets = false;
for ( i = 0; i < length(str); i++) {
if (str[i] == '[' )
inside_brackets = true;
else if str[i] == ']'
inside_brackets = false;
if ( ! inside_brackets && is_space(str[i]) )
delete(str[i]);
}
Run Code Online (Sandbox Code Playgroud)
任何涉及正则表达式的东西都会涉及很多外观的东西,这些东西会一遍又一遍地重复,而且它会慢得多,而且难以理解.
要使其适用于嵌套括号,只需更改inside_brackets为计数器,从零开始,在开括号上递增,在右括号上递减.