提取以相同的两个字符开头并以数字字符结尾的文本

Posted

技术标签:

【中文标题】提取以相同的两个字符开头并以数字字符结尾的文本【英文标题】:Extract text which begin with the same two characters and end in a numeric character 【发布时间】:2015-06-17 09:36:04 【问题描述】:

我想从更大的文本提取中提取代码,我拥有的常量是代码将以 WP 或 MD 开头并以数字值结尾,代码可以使用的模式示例如下;

WP0053

WP053

WP_053

WP_0053

WP 053

WP 0053

MDC_308

WP6

WP6.1

MDC_0308

请看下面预期输出的图片;

任何帮助将不胜感激

【问题讨论】:

如果它总是以项目 id 后跟下划线开头,您可以将其替换为空字符串。您想要的代码将位于剩余字符串的开头。之后,使用空格作为分隔符进行拆分并获取第一个标记。 您应该发布您尝试过的任何内容。这不是代码编写服务,而是帮助修复损坏的代码。 【参考方案1】:

公共函数GetCode(data As String) As String

startpos = InStr(data, "WP")
If startpos = 0 Then startpos = InStr(data, "MD")

fisrtNumPos = 0
For i = startpos To Len(data)

    If fisrtNumPos = 0 And LastNumPos = 0 Then
        If IsNumeric(Mid(data, i, 1)) Then
            fisrtNumPos = i
        End If
    Else
        If Not IsNumeric(Mid(data, i, 1)) Then
            LastNumPos = i
            Exit For
        End If
    End If
Next i

Endpos = LastNumPos - startpos

GetCode = Mid(data, startpos, Endpos)

结束函数

将此代码添加到任何模块中并尝试。

【讨论】:

【参考方案2】:

如果您的代码没有空间,那么下面的代码会有所帮助。

子测试()

Data = "A850085_MDC-WP-01003_SRI Phase 2 - Programme Manager - Dionysios Psachoulias"

startpos = InStr(Data, "WP")
If startpos = 0 Then startpos = InStr(Data, "MD")

fisrtNumPos = 0
LastNumPos = 0
For i = startpos To Len(Data)

    If fisrtNumPos = 0 And LastNumPos = 0 Then
        If IsNumeric(Mid(Data, i, 1)) Then
            fisrtNumPos = i
        End If
    Else
        If Not IsNumeric(Mid(Data, i, 1)) Then
            LastNumPos = i
            Exit For
        End If
    End If
Next i

Endpos = LastNumPos - startpos

Debug.Print Mid(Data, startpos, Endpos)

结束子

现在应该可以了。但如果文本包含“MD”后跟“WP”,那么它将只从 WP 获取代码。

例如: data= "A850085_WPC-MD-01003_SRI 第 2 阶段 - 项目经理 - Dionysios Psachoulias"

那么结果将是 结果=“WPC-MD-01003”

【讨论】:

#prabu k,尝试使用第 6 行的代码(图像示例)结果是:MDC-WP-01003_SRI 感谢您的支持 - 它工作得非常好,我可以在即时窗口中看到结果。但是,很抱歉,因为这可能是一个非常“简单”的问题,我如何将此代码转换为(UDF)公共函数,因为我使用的常用方法似乎不起作用并且返回“值”。 我已经发布了函数作为另一个答案,看看告诉我。【参考方案3】:

尝试类似的方法:-

Dim cell
Dim tmp as string

For each cell in activesheet.columns(1).usedrange.cells
    If InStr(1, cell.Value, "_MDC_", vbTextCompare) > 0 Then
        tmp = Right(cell.Value, Len(cell.Value) - InStr(1, cell.Value, "_MDC_", vbTextCompare))
        tmp = Left(tmp, InStr(1, tmp, " ", vbTextCompare) - 1)
        cell.offset(0,2).value = tmp
    End If
next cell

【讨论】:

以上是关于提取以相同的两个字符开头并以数字字符结尾的文本的主要内容,如果未能解决你的问题,请参考以下文章

用于聚合键包含数字的键值对的算法

python 返回以start开头并以end结尾的子字符串

set<string>:如何列出不以给定字符串开头并以`/`结尾的字符串?

如何在以特定单词开头并以另一个单词结尾的字符串中出现多次[重复]

Pandas 提取以 [\s\d_/] 开头并以 [\s\d_/] 结尾的信息

替换从字符开始并以另一个字符结束的文本文件中的子字符串