【问题标题】:Javascript function to ensure string has space every n charactersJavascript函数确保字符串每n个字符有一个空格
【发布时间】:2017-08-24 12:26:21
【问题描述】:

我知道在 javascript 中,您可以使用正则表达式在字符串中每隔 n 个字符添加一个字符:

str.replace(/(.{5})/g,"$1*");

这会在字符串中每 5 个字符插入一个“*”。

但是,我想要一种方法,只添加一个不存在的字符。

例如。在需要的地方插入一个空格,以确保至少每 5 个字符有一个空格字符(不要在不需要的地方插入):

myfunc('01234567890', ' ', 5) = '01234 56789 0'
myfunc('01 234567890', ' ', 5) = '01 23456 7890'
myfunc('01 234 56789 0', ' ', 5) = '01 234 56789 0'

这可以在javascript中使用正则表达式或其他方式吗?

【问题讨论】:

  • 我在my answer 中添加了解决方案的描述。请检查以下答案并考虑接受适合您的答案。

标签: javascript regex


【解决方案1】:

使用\d匹配数字,所以用\d{5}匹配一行5位,使用$1后插入一个空格;还可以使用前瞻 (?=\S) 来断言已经没有空格:

var samples = ['01234567890', '01 234567890', '01 234 56789 0', '0123456789'];

console.log(
  samples.map(s => s.replace(/(\d{5})(?=\S)/g, '$1 '))
);

【讨论】:

  • 请注意:最后一个例子有一个双空格。我认为另一个正则表达式删除双空格是最好的选择?
  • 没有。问题.. 也很好解决.. 希望反对的选民会撤回。因为这个正则表达式看起来最容易理解..
  • @Keith 感谢您的评论。
  • 虽然这对于硬编码场景来说是可以的(以空格作为分隔字符),但我认为它最终不会帮助 OP,因为要插入的字符可能不是空格,它是一个可变字符。然后,(?=\S) 将不起作用。
  • 是的 - 是否有可能将其作为输入字符数和替换字符的函数?
【解决方案2】:

. 替换为[0-9] 以仅匹配数字并使用负前瞻(?!...) 其中... 是您的字符:

function myfunc(s, ch, limit) {
  var rx = new RegExp(
    "[0-9]{"+limit+"}"+ // Match a digit, limit times
    "(?!"+  // Only match if, immediately to the right, there is no
    ch.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')+ // delimiting char (escaped)
    "|$)", // or end of string
    "g"); // Global modifier, replace all occurrences
  return s.replace(rx, "$&" + ch); // Replace with the match itself + delimiting char
}
console.log(myfunc('01234567890', ' ', 5))    // = '01234 56789 0'
console.log(myfunc('01 234567890', ' ', 5))   // = '01 23456 7890'
console.log(myfunc('01 234 56789 0', ' ', 5)) // = '01 234 56789 0'

这里生成的示例正则表达式看起来像[0-9]{5}(?! |$)[0-9]{5}(?! |$) 将匹配不带空格或字符串结尾的 5 个数字(添加是因为您很少希望在字符串末尾插入任何内容,因此,如果您还想在字符串末尾插入空格, 从模式中删除 |$),替换 $& 将替换为它自己 ($&) 和后面的空格。

请注意,ch 使用 .replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') 转义,以防它是特殊的正则表达式元字符(如 ())。

【讨论】:

    猜你喜欢
    • 2011-05-07
    • 1970-01-01
    • 2021-05-22
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    相关资源
    最近更新 更多