JS正则表达式 - 在周围添加空格/没有周围的空格

时间:2017-10-01 10:11:14

标签: javascript regex

我需要在Javascript中实现一个方法,在周围添加空格/没有周围的空格。

实施例: hello/this /is a/ complicated/task会产生hello / this /is a/ complicated / task

到目前为止的M方法:

inputString.replace(new RegExp(/([^\s])\/([^\s])/), '$1 / $2');

但这只取代了第一次出现。如何让它取代所有?

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不匹配,因为/右侧已有空格。

相反,您可以使用替换功能断言以下内容:

  1. 查找所有/个字符(/g修饰符,全局)
  2. 如果在特定/之前出现空格,请将其匹配(使用?作为可选项)
  3. 如果在特定/之后出现空格,请将其匹配(使用?作为可选项)
  4. 将所有匹配替换为用空格字符包围的文字/
  5. 这会给你以下声明:

    inputString.replace(/\s?\/\s?/g, ' / ');
    

    这将为您提供:'hello / this / is a / complicated / task'

    您的首选输出表明没有空格应围绕多字序列。我们可以通过链接另一个替换调用来实现这一点,而不是试图将所有这些都放在一个正则表达式中。我们现在要匹配的是多字序列(2个或更多的单词用空格分隔,用空格包围),并且只捕获没有周围空格的多字序列:

    1. 查找以可选空格开头和结尾的子字符串:
      \s?\s?

    2. 捕捉这些空间之间的所有内容:
      \s?()\s?

    3. 捕获的字符串应以单词字符序列开头:
      \s?(\w+)\s?

    4. 通过在捕获组内添加一个非捕获组,确保正则表达式与单字序列不匹配,该捕获组至少匹配一次(+)以空格开头的子字符串,然后是另一个单词序列:
      \s?(\w+(?:\s\w+)+)\s?

    5. 现在我们可以编写以下链:

      inputString
          .replace(/\s?\/\s?/g, ' / ')
          .replace(/\s?(\w+(?:\s\w+)+)\s?/g, '$1');
      

      如果您希望确保结果中不出现前导空格或尾随空格,并且inputString可能会以/开始和/或结束,则可以链接String.prototype.trimreplace()来电后致电:

      inputString
          .replace(/\s?\/\s?/g, ' / ')
          .replace(/\s?(\w+(?:\s\w+)+)\s?/g, '$1')
          .trim();