【问题标题】:Add underscore before every upper case letter followed by lower case在每个大写字母前添加下划线,后跟小写字母
【发布时间】:2017-05-03 01:40:55
【问题描述】:

我试图在每个大写字母前加上下划线,然后是小写字母。示例如下:

cases <- c("XrefAcctnoAcctID", "NewXref1AcctID", "NewXref2AcctID", "ClientNo")

我有这个:

[1] "XrefAcctnoAcctID" "NewXref1AcctID"  
[3] "NewXref2AcctID"   "ClientNo"     

我想要这个:

"xref_acctno_acct_id" 
"new_xref1_acct_id"   
"new_xref2_acct_id"    
"client_no" 

我能走这么远:

> tolower(gsub("([a-z])([A-Z])", "\\1_\\2", cases))
[1] "xref_acctno_acct_id" "new_xref1acct_id"   
[3] "new_xref2acct_id"    "client_no" 

但是"new_xref1acct_id" "new_xref2acct_id" 并不能反映我想要的。

【问题讨论】:

  • 只需在您的正则表达式中将[a-z] 更改为[a-z0-9] 以匹配大写字母之前的小写字母或数字。或更改为 (.)([A-Z]) 以匹配大写字母之前的任何内容。

标签: r regex


【解决方案1】:

我们可以使用正则表达式查找来匹配显示小写字母或数字后跟大写字母的模式,并将其替换为_

tolower(gsub("(?<=[a-z0-9])(?=[A-Z])", "_", cases, perl = TRUE))
#[1] "xref_acctno_acct_id" "new_xref1_acct_id"   "new_xref2_acct_id"  
#[4] "client_no"  

或者没有环视,我们可以将小写或数字作为一个组,然后将大写字母作为另一个组,并将其替换为该组的反向引用,以_分隔

tolower(gsub("([a-z1-9])([A-Z])", "\\1_\\2", cases))
#[1] "xref_acctno_acct_id" "new_xref1_acct_id"   "new_xref2_acct_id"  
#[4] "client_no"       

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 2021-01-06
    • 2016-11-14
    • 1970-01-01
    • 2019-08-08
    相关资源
    最近更新 更多