我需要在Javascript中实现一个方法,在周围添加空格/没有周围的空格。
实施例:
hello/this /is a/ complicated/task
会产生hello / this /is a/ complicated / task
到目前为止的M方法:
inputString.replace(new RegExp(/([^\s])\/([^\s])/), '$1 / $2');
但这只取代了第一次出现。如何让它取代所有?
答案 0 :(得分:2)
你错过了RegExp中的global
标志。
将/([^\s])\/([^\s])/
更改为/([^\s])\/([^\s])/g
更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp
修改强>
你也可以这样做:new RegExp(/([^\s])\/([^\s])/, 'g')
答案 1 :(得分:1)
如果两侧不存在空格,则您使用的正则表达式仅匹配/
的出现次数。因此some text/ some more
不匹配,因为/
右侧已有空格。
相反,您可以使用替换功能断言以下内容:
/
个字符(/g
修饰符,全局)/
之前出现空格,请将其匹配(使用?
作为可选项)/
之后出现空格,请将其匹配(使用?
作为可选项)/
这会给你以下声明:
inputString.replace(/\s?\/\s?/g, ' / ');
这将为您提供:'hello / this / is a / complicated / task'
。
您的首选输出表明没有空格应围绕多字序列。我们可以通过链接另一个替换调用来实现这一点,而不是试图将所有这些都放在一个正则表达式中。我们现在要匹配的是多字序列(2个或更多的单词用空格分隔,用空格包围),并且只捕获没有周围空格的多字序列:
查找以可选空格开头和结尾的子字符串:
\s?\s?
捕捉这些空间之间的所有内容:
\s?()\s?
捕获的字符串应以单词字符序列开头:
\s?(\w+)\s?
通过在捕获组内添加一个非捕获组,确保正则表达式与单字序列不匹配,该捕获组至少匹配一次(+
)以空格开头的子字符串,然后是另一个单词序列:
\s?(\w+(?:\s\w+)+)\s?
现在我们可以编写以下链:
inputString
.replace(/\s?\/\s?/g, ' / ')
.replace(/\s?(\w+(?:\s\w+)+)\s?/g, '$1');
如果您希望确保结果中不出现前导空格或尾随空格,并且inputString
可能会以/
开始和/或结束,则可以链接String.prototype.trim
在replace()
来电后致电:
inputString
.replace(/\s?\/\s?/g, ' / ')
.replace(/\s?(\w+(?:\s\w+)+)\s?/g, '$1')
.trim();