从汽车列表中提取年份如何从包含文本和其他数字的字符串中提取四位数字

c9qzyr3d  于 2021-07-24  发布在  Java
关注(0)|答案(4)|浏览(283)

我有一些我想从中提取的汽车清单。我本来打算用excel来做这件事,但我想我已经达到了它的极限。
举个例子:

2000 lotus elise 
1996 Porsche 911 
Nissan Z280 from 1984

我想找到一种提取和打印的方法

2000
1996
1984

分为一列

=TEXTJOIN("",TRUE,IFERROR((MID(A2,ROW(INDIRECT("1:"&LEN(A2))),1)*1),""))

但列表中的其他数字可能会使它失效。在这些例子中,我会得到

2000
1996911
1984280

似乎应该有一种方法可以在sql中实现这一点,但我也不知道。希望有任何提示或指点能让我朝着正确的方向前进

kcugc4gi

kcugc4gi1#

您可以使用:

=FILTERXML("<t><s>"&SUBSTITUTE(A1," ","</s><s>")&"</s></t>","//s[.*0=0][string-length(.)=4]")


如果可能出现4个以上字符的数字,则可以更安全地检查这些数字的范围:

=FILTERXML("<t><s>"&SUBSTITUTE(A1," ","</s><s>")&"</s></t>","//s[.*1>=1885][.*1<=2020]")

为了更安全,添加以前使用的 [string-length(.)=4] 以防止“0002000”被接受为一年。
生成的数组将溢出到ExcelO365中。在旧版本的excel中,它只返回第一个结果。对你来说这就是你需要的。如果出于任何原因需要数组中的另一个值,请使用 INDEX() .
如果这能激发你对 FILTERXML ,你会发现这很有趣。

ccrfmcuu

ccrfmcuu2#

以下是在oracle中测试的查询:
ddl地址:

create table tab1( str varchar2(25));

INSERT ALL
into tab1(str) values('2000 lotus elise')
into tab1(str) values('1996 Porsche 911')
into tab1(str) values('Nissan Z280 from 1984')
select * from dual;

如果您使用上面的表格:

Select str, regexp_substr(str,'^\d{4}|\d{4}$') from tab1;

Select str, regexp_substr(str,'^[[:digit:]]{4}|[[:digit:]]{4}$') from tab1;

输出:

+-----------------------+------------------------------------+
|          STR          | REGEXP_SUBSTR(STR,'^\D{4}|\D{4}$') |
+-----------------------+------------------------------------+
| 2000 lotus elise      | 2000                               |
+-----------------------+------------------------------------+
| 1996 Porsche 911      | 1996                               |
+-----------------------+------------------------------------+
| Nissan Z280 from 1984 | 1984                               |
+-----------------------+------------------------------------+
avkwfej4

avkwfej43#

在excel中,可以使用正则表达式创建自定义函数,例如:

Function FindYear(str As String)

Dim regEx As Object, obj As Object
Dim strPattern As String

Set regEx = CreateObject("vbscript.regexp")

strPattern = "\b[0-9]{4}\b" 'looks for (4 consecutive numbers)

With regEx

       .Pattern = strPattern

        If .test(str) Then

            FindYear = .Execute(str)(0)

        Else
            FindYear = ""
        End If

End With
End Function

如果您不确定如何创建自定义函数,可以在此处阅读

laximzn5

laximzn54#

我不认为任何excel公式都能很好地解决这个问题,因此我建议vba宏a udf(user define function),帮助您解决这个问题。

Function GetYear(s As String)

With CreateObject("vbscript.regexp")
  .Pattern = "\b\d{4}\b"
  If .Test(s) Then GetYear = .Execute(s)(0)
End With

End Function

请注意
将此代码用作模块。
您需要确保microsoft vbscript regular expression 5.5可用作参考。
请按照以下步骤进行检查:
1.在vb编辑器中点击“工具”选项卡,然后点击“引用”。
2.找到vbscript正则表达式5.5并检查它。
将工作簿另存为启用宏。
在单元格d66中输入以下公式。 =GetYear(C66) 您可以根据需要调整公式中的单元格引用。

相关问题