【问题标题】:Putting space in camel case string using regular expression使用正则表达式在驼峰字符串中放置空格
【发布时间】:2013-02-28 10:59:54
【问题描述】:

我的问题来自add a space between two words

要求:拆分驼峰式字符串并在大写字母之前放置空格,然后是小写字母,或者可以什么都没有。大写字母之间不应出现空格。

例如:CSVFilesAreCoolButTXT 是一个字符串,我想以这种方式生成它CSV Files Are Cool But TXT

我是这样开普通快车的:

"LightPurple".replace(/([a-z])([A-Z])/, '$1 $2')

如果你有超过 2 个单词,那么你需要使用 g 标志来匹配它们。

"LightPurpleCar".replace(/([a-z])([A-Z])/g, '$1 $2')

如果尝试拆分 CSVFile 之类的单词,那么您可能需要改用此正则表达式:

"CSVFilesAreCool".replace(/([a-zA-Z])([A-Z])([a-z])/g, '$1 $2$3')

但它仍然不能满足我提出要求的方式。

【问题讨论】:

  • 您的最后一个正则表达式仅在以大写字母结尾时才会失败。例如。 ...ButTXT

标签: regex


【解决方案1】:
var rex = /([A-Z])([A-Z])([a-z])|([a-z])([A-Z])/g;

"CSVFilesAreCoolButTXT".replace( rex, '$1$4 $2$3$5' );
// "CSV Files Are Cool But TXT"

还有

"CSVFilesAreCoolButTXTRules".replace( rex, '$1$4 $2$3$5' );    
// "CSV Files Are Cool But TXT Rules"

匹配正则表达式模式的主题字符串的文本将被替换字符串'$1$4 $2$3$5' 替换,其中$1$2 等指的是与模式的捕获组() 匹配的子字符串。

$1指的是第一个([A-Z])子模式匹配的子串,$3指的是第一个([a-z])子模式匹配的子串等

由于替换字符|,要进行匹配,正则表达式必须匹配([A-Z])([A-Z])([a-z]) 子模式或([a-z])([A-Z]) 子模式,因此如果匹配多个捕获组将保持无与伦比。这些捕获组可以在替换字符串中引用,但它们对它没有任何影响 - 实际上,它们将引用一个空字符串。

替换字符串中的空格确保每次匹配时都会在主题字符串中插入一个空格(结尾的g 标志意味着正则表达式引擎将查找多个匹配项)。

【讨论】:

  • 我很想看到你定义的正则表达式的解释,所以读者和新手会知道所有这些 1-2-3-4-5 到底发生了什么。
  • 好的最适合我在初始要求中所说的。现在我提出了更多的压力。所以让我们在这个线程下猛击它。阅读更新。
  • @KMX。我建议您提出一个新问题,让其他人有机会获得一些认可的答案。
  • (doh) 好吧!很快就会创建。
【解决方案2】:

如果第一个字符总是小写。

'camelCaseString'.replace(/([A-Z]+)/g, ' $1')

如果第一个字符是大写的。

'CamelCaseString'.replace(/([A-Z]+)/g, ' $1').replace(/^ /, '')

【讨论】:

    【解决方案3】:

    在 .NET 中使用正则表达式拆分 CamelCase:

    Regex.Replace(input, "((?<!^)([A-Z][a-z]|(?<=[a-z])[A-Z]))", " $1").Trim();
    

    示例:

    Regex.Replace("TheCapitalOfTheUAEIsAbuDhabi", "((?<!^)([A-Z][a-z]|(?<=[a-z])[A-Z]))", " $1").Trim();
    

    输出: 阿联酋的首都是阿布扎比

    【讨论】:

    • Trim() 似乎不是必需的,至少在将解决方案迁移到 JavaScript 时是这样。
    【解决方案4】:

    使用 lookaheads / behinds 替换 Javascript 的驼峰式大小写:

    "TheCapitalOfTheUAEIsAbuDhabi".replace(/([A-Z](?=[a-z]+)|[A-Z]+(?![a-z]))/g, ' $1').trim()
    // "The Capital Of The UAE Is Abu Dhabi"
    

    【讨论】:

    • "TheCapitáÖfTheUAEIsAbuDhabi".replace(/([AZ](?=[az]+)|[AZ]+(?![az]))/g, '$1').trim( ) 失败,至少在 Firefox 的 JS 引擎中是这样
    • 必须考虑 unicode 字符。以上仅适用于 ascii 子集。
    【解决方案5】:

    这对我有用

    let camelCase = "CSVFilesAreCoolButTXTRules"
    let re = /[A-Z-_\&](?=[a-z0-9]+)|[A-Z-_\&]+(?![a-z0-9])/g
    let delimited = camelCase.replace(re,' $&').trim()
    

    上面的代码几乎适用于我拥有的所有用例。我有一些特殊之处,其中 '&' 和 '_' 应该被视为等同于大写字符

    • ThisIsASlug ---> 这是一个蛞蝓
    • loremIpsum ---> lorem Ipsum
    • PAGS_US ---> PAGS_US
    • TheCapitalOfTheUAEIsAbuDhabi ---> 阿联酋的首都是阿布扎比
    • eclipseRCPExt ---> Eclipse RCP Ext
    • 值 ---> 值
    • SG&A ---> SG&A

    简要说明

    [A-Z-_\&](?=[a-z0-9]+)
    //Matches normal words i.e. one uppercase followed by one or more non-uppercase characters 
    
    
    [A-Z-_\&]+(?![a-z0-9]) 
    //Matches acronyms & abbreviations i.e. a sequence of uppercase characters that are not followed by non-uppercase characters
    

    Check out the regexr fiddle here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-21
      • 2017-03-11
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多