regex - 将单元格值转换为snake_case
问题描述
我有一些数据清理任务。我有一个专栏,从 H6 开始,然后再往下。该列包含应该在snake_case 中的数据,但事实并非如此。单元格值的形式为:
- 带骆驼壳:“CamelCase”
- 带空格:“间隔值”
- 带有一些初始调用上限:ALLCAPSPREFIX_rest
- 以上结合
我知道没有具体的算法可以将这一切都带到snake_case,但我想提出至少将大多数单元格带到snake_case的代码。
我尝试使用 VBA 代码用下划线替换空格并获取下划线的索引。现在我想把下划线后面的所有字符都变成小写。此外,我正在考虑替换两个字符的序列:第一个小写字母和下一个大写字母,比如我lC
不想转换为. 但在更进一步之前,我想知道是否有更简单的方法来解决这个问题。l_c
CCC
c_c_c
ccc
解决方案
这是一种可以满足您要求的方法:
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
这是正则表达式和替换字符串的解释:
Snake_case 转换
([A-Za-z0-9]+)(?=[ _A-Z])[ _]?(\S+)
选项:区分大小写;^$ 匹配换行符
- 匹配下面的正则表达式并将其匹配捕获到反向引用编号 1
([A-Za-z0-9]+)
- 断言下面的正则表达式可以从这个位置开始匹配(正前瞻)
(?=[ _A-Z])
- 匹配列表“_”中的单个字符</a>
[ _]?
- 匹配下面的正则表达式并将其匹配捕获到反向引用编号 2
(\S+)
$1_$2
推荐阅读
- python - 如何覆盖 Django 管理页面?
- python - 使用 pd.update 仅更新数据帧的一部分
- java - 拆分字符串时数组大小错误
- java - Netty:创建有状态的同步出站管道的最佳方式?
- python - R:在时间序列中为异常检测拟合深度学习模型时出错
- react-native - react-native-gesture-handler 无法安装并显示编译错误
- reactjs - 安装Material UI时,提示一系列错误?
- nginx - Nginx proxy_pass 从 *.local.domain.com 到 *.domain.com
- android - 每次我进行更改时,Android Studio Canary 4.2 都会自动重建我的项目
- qt - ListView QML中图像的来源是什么