如何使用正则表达式获取不带扩展名的文件名
How to get file name without extension with using Regular Expressions
我有一个包含以下值的字段,现在我只想提取下面提到的字段值中包含 "xyz" 的那些行,你能帮忙吗?
Mydata_xyz_aug21
Mydata2_zzz_aug22
Mydata3_xyz_aug33
还有一个要求
我只想从下面的字符串中提取 "aIBM_MyProjectFile",你能帮我解决这个问题吗?
finaldata/mydata/aIBM_MyProjectFile.exe.ld
我试过了,但没用。
select
regexp_substr('FinalProject/MyProject/aIBM_MyProjectFile.exe.ld','([^/]*)[\.]') exp
from dual;
要提取第一对下划线之间的子字符串,您需要使用
regexp_substr('Mydata_xyz_aug21','_([^_]+)_', 1, 1, NULL, 1)
要获取不带扩展名的文件名,需要
regexp_substr('FinalProject/MyProject/aIBM_MyProjectFile.exe.ld','.*/([^.]+)', 1, 1, NULL, 1)
请注意,每个正则表达式都包含一个捕获组((...)
中的一个模式),并且这个值是通过 regexp_substr
函数的最后一个 1
参数访问的。
_([^_]+)_
模式找到第一个 _
,然后将 _
以外的 1 个或多个字符放入第 1 组,然后匹配另一个 _
.
.*/([^.]+)
模式匹配整个文本直到最后一个 /
,然后使用 ([^.]+)
将 .
以外的 1 个或多个字符捕获到第 1 组中。
对于第一个要求,使用 LIKE
就足够了,如上面的答案中所述:
SELECT column
FROM table
WHERE column LIKE '%xyz%';
对于您的第二个要求(提取),您必须使用 REGEXP_SUBSTR
函数:
SELECT REGEXP_SUBSTR ('FinalProject/MyProject/aIBM_MyProjectFile.exe.ld', '.*/([^.]+)', 1, 1, NULL, 1)
FROM DUAL
希望对您有所帮助!
另一种方法是完全跳过正则表达式:
WITH
aset AS
(SELECT 'with_extension.txt' txt FROM DUAL
UNION ALL
SELECT 'without_extension' FROM DUAL)
SELECT CASE
WHEN INSTR (txt, '.', -1) > 0
THEN
SUBSTR (txt, 1, INSTR (txt, '.', -1) - 1)
ELSE
txt
END
txt
FROM aset
结果是
with_extension
without_extension
A BIG 注意正则表达式更好的地方:
我的方法没有正确处理这种情况:
\this\is.a\test
所以在我完成所有这些努力之后,请继续使用正则表达式解决方案。我会把它留在这里,以便其他人可以从中学习。
我有一个包含以下值的字段,现在我只想提取下面提到的字段值中包含 "xyz" 的那些行,你能帮忙吗?
Mydata_xyz_aug21
Mydata2_zzz_aug22
Mydata3_xyz_aug33
还有一个要求
我只想从下面的字符串中提取 "aIBM_MyProjectFile",你能帮我解决这个问题吗?
finaldata/mydata/aIBM_MyProjectFile.exe.ld
我试过了,但没用。
select
regexp_substr('FinalProject/MyProject/aIBM_MyProjectFile.exe.ld','([^/]*)[\.]') exp
from dual;
要提取第一对下划线之间的子字符串,您需要使用
regexp_substr('Mydata_xyz_aug21','_([^_]+)_', 1, 1, NULL, 1)
要获取不带扩展名的文件名,需要
regexp_substr('FinalProject/MyProject/aIBM_MyProjectFile.exe.ld','.*/([^.]+)', 1, 1, NULL, 1)
请注意,每个正则表达式都包含一个捕获组((...)
中的一个模式),并且这个值是通过 regexp_substr
函数的最后一个 1
参数访问的。
_([^_]+)_
模式找到第一个 _
,然后将 _
以外的 1 个或多个字符放入第 1 组,然后匹配另一个 _
.
.*/([^.]+)
模式匹配整个文本直到最后一个 /
,然后使用 ([^.]+)
将 .
以外的 1 个或多个字符捕获到第 1 组中。
对于第一个要求,使用 LIKE
就足够了,如上面的答案中所述:
SELECT column
FROM table
WHERE column LIKE '%xyz%';
对于您的第二个要求(提取),您必须使用 REGEXP_SUBSTR
函数:
SELECT REGEXP_SUBSTR ('FinalProject/MyProject/aIBM_MyProjectFile.exe.ld', '.*/([^.]+)', 1, 1, NULL, 1)
FROM DUAL
希望对您有所帮助!
另一种方法是完全跳过正则表达式:
WITH
aset AS
(SELECT 'with_extension.txt' txt FROM DUAL
UNION ALL
SELECT 'without_extension' FROM DUAL)
SELECT CASE
WHEN INSTR (txt, '.', -1) > 0
THEN
SUBSTR (txt, 1, INSTR (txt, '.', -1) - 1)
ELSE
txt
END
txt
FROM aset
结果是
with_extension
without_extension
A BIG 注意正则表达式更好的地方:
我的方法没有正确处理这种情况:
\this\is.a\test
所以在我完成所有这些努力之后,请继续使用正则表达式解决方案。我会把它留在这里,以便其他人可以从中学习。