regex 将像元值转换为snake_case

ghhkc1vu  于 2023-08-08  发布在  其他
关注(0)|答案(2)|浏览(113)

我有一些数据清理任务。我有一个列,从H6开始,再从他们的。该列包含应该在snake_case中的数据,但实际情况并非如此。单元格值的形式为:

  • 带 Camel 箱:“ Camel 箱”
  • 带空格:“间隔值”
  • 有一些初始呼叫上限:ALLCAPSPREFIX_rest
  • 以上组合

我知道没有具体的算法可以将所有这些都带到snake_case,但我想提出至少可以将大多数细胞带到snake_case的代码。
我尝试了VBA代码来用下划线替换空格,并获得了下划线的索引。现在我想把下划线后面的所有字符都变成小写。此外,我想替换两个字符的序列:第一个小写,第二个大写,比如lCl_c,因为我不希望CCC转换为c_c_c,而是转换为ccc。但在进一步讨论之前,我想知道是否有更简单的方法。

6rvt4ljy

6rvt4ljy1#

这里有一个方法可以实现您想要的功能:

Option Explicit
Function Snake_case(s As String) As String
    Dim RE As Object
    Const sPat As String = "([A-Za-z0-9]+)(?=[ _A-Z])[ _]?(\S+)"
    Const sRepl As String = "$1_$2"
    Dim v As Variant

Set RE = CreateObject("vbscript.regexp")
With RE
    .Global = True
    .ignorecase = False
    .Pattern = sPat
    v = Split(.Replace(s, sRepl), "_")
End With

v(0) = WorksheetFunction.Proper(v(0))
v(1) = LCase(v(1))
Snake_case = Join(v, "_")

End Function

字符串
x1c 0d1x的数据
下面是正则表达式和替换字符串的解释:

Snake_case转换

([A-Za-z0-9]+)(?=[ _A-Z])[ _]?(\S+)


选项:区分大小写;^$换行匹配

$1_$2

使用RegexBuddy创建

ffscu2ro

ffscu2ro2#

罗恩·罗森菲尔德的解决方案对我不起作用。我用这个代替。在论坛https://www.mrexcel.com/board/threads/camelcase-to-proper-case.381040/上取了类似的

Option Explicit
Function ToSnakeCase(txt As String) As String
'
' If cell A1 contains: SanFrancisco
' cell B1: =ToSnakeCase(A1)
' cell B1: San_Francisco
'
Dim Hold As String, i As Long
Hold = Left(txt, 1)
For i = 2 To Len(txt) Step 1
  If Asc(Mid(txt, i, 1)) > 96 Then
    Hold = Hold & Mid(txt, i, 1)
  Else
    Hold = Hold & "_" & Mid(txt, i, 1)
  End If
Next i
ToSnakeCase = Hold
End Function

字符串

相关问题