【问题标题】:change case with regex [duplicate]用正则表达式改变大小写[重复]
【发布时间】:2018-11-10 11:18:33
【问题描述】:

我想转换这个文本

font-size-18

到这里

fontSize18

使用正则表达式。这是我的足迹:

let conv = str => str.replace(/\-[a-z]/gi,/[A-Z]/gi);

但它不起作用,我可以在没有 Regex 的情况下做到这一点。但是我想用正则表达式来做,这可以用正则表达式来完成吗?

【问题讨论】:

    标签: regex uppercase lowercase camelcasing


    【解决方案1】:

    匹配破折号后跟单个字符,并使用返回该字符toUpperCase的替换函数:

    const dashToCamel = str => str.replace(/-(\w)/g, (_, g1) => g1.toUpperCase());
    console.log(dashToCamel("font-size-18"));

    这假定所有破折号后跟单词字符(尽管您可以使用 . 代替 \w)。请注意,由于您似乎想要替换 所有 破折号,因此您应该匹配并替换所有破折号,而不仅仅是后跟字母字符的破折号。

    【讨论】:

    • 太好了,我只想替换后跟字符的破折号。你的代码可以工作,但我有一个问题:为什么这个替换函数中的“_”?我猜应该是“-”
    • 这是一个参数而不是字符串。第一个参数是完全匹配,这是不必要的 - 我们只想替换为第一个捕获的组(这是第二个参数),大写。
    【解决方案2】:

    您的替换函数使用-[a-z],它只会匹配-s,并将replace/[A-Z]/gi 匹配。

    您可以使匹配更具体一点,以捕获捕获组中没有破折号的所有部分,并为捕获s 的组(组 2)使用 toUpperCase

    ([a-z]+)-([a-z])([a-z]*)-(\d+)

    Regex demo

    会匹配

    • ([a-z]+) 捕获 1+ 次 a-z 到第 1 组
    • - 字面上匹配
    • ([a-z]) 将单个 a-z 捕获到第 2 组中
    • ([a-z]*) 捕获 0+ 次 a-z 到第 3 组
    • - 字面匹配
    • (\d+) 捕获 1+ 位到第 4 组

    const conv = str => str.replace(
      /([a-z]+)-([a-z])([a-z]*)-(\d+)/g,
      (_, p1, p2, p3, p4) => p1 + p2.toUpperCase() + p3 + p4
    );
    console.log(conv("font-size-18"));

    【讨论】:

    • 有点复杂但很棒。非常感谢
    • @AhmedElbessfy 我已经为正则表达式添加了解释。
    • 好的,现在 p1,p2,p3,p4 是什么?
    • @AhmedElbessfy 这些是replace 可以访问的捕获组的数量。
    • 哦,很好,这里的“” (, p1, p2, p3, p4) => p1 + p2.toUpperCase() ?
    【解决方案3】:

    echo font-size-18 | sed "s/-s/S/g" | sed "s/-1/1/g"

    【讨论】:

    • 哎呀,不起作用?!
    • 语言不正确
    • 复制并粘贴到终端并回车:|
    • 感谢您提供帮助,但我想要它在 javascript 中。我猜这是 PHP
    • 啊哈。那是 sedbash
    猜你喜欢
    • 1970-01-01
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 2015-05-23
    • 2020-05-13
    • 1970-01-01
    • 2012-11-01
    相关资源
    最近更新 更多