如何从单词“vendor_reg_analysis_healthcare.xls”中取出单词“healthcare”,通过使用正则表达式命令,通过详细说明,我需要从整个名称的第三个_之后和点之前取出一个单词。这样我就可以从“vendor_reg_analysis_healthcare.xls”中获取名称“healthcare”
答案1
您使用什么工具来表达正则表达式?
一般来说,我认为下列之一可能可以作为匹配表达式:
.*_([^_]*)\..*
然后你就会在“捕获”第一项中获得一些东西。
例如在 perl 中,这可能是:
$s = "vendor_reg_analysis_healthcare.xls";
$s =~ /.*_([^_]*)\..*/;
print $1, "\n";
或者,如果您想就地修改 $s:
$s =~ s/.*_([^_]*)\..*/$1/;
现在,$s 将包含“医疗保健”。
所以……上面的表达式将专门捕获 之后_
和 之前的最后一件事.
。如果 的数量_
是可变的,这可能是也可能不是你想要的。例如,如果你有不下划线,则匹配失败。或者,如果您有 4 个下划线,并且希望第 3 个下划线之后的下划线仍然是结果字符串的一部分,那么这也是错误的。
此外,根据您使用的正则表达式引擎,您可能需要或不需要在括号前使用反斜杠,例如:
.*_\([^_]*\)\..*
例如sed
(正如另一个答案中提到的,虽然你提到了Windows,所以我猜这不是你选择的工具):
echo vendor_reg_analysis_healthcare.xls | sed -e 's/.*_\([^_]*\)\..*/\1/'
无论如何,这能满足您的需求吗?如果没有,请详细说明您的正则表达式是在什么上下文(引擎、软件程序等)中运行的(“SO” 是软件吗?我不知道您帖子的这一部分是什么意思),以及/或者您正在寻找的更具体的细节。
无论如何,下面是上述表达式的分解部分:
.*
- 吞噬尽可能多的字符(零到多个(*
)个任意字符(.
))_
- 后面跟着下划线(
- 开始捕捉[^_]*
- 捕获零到多个非下划线字符([
定义]
一个字符类,它不是(^
)下划线;然后零到多个(*
)这样的字符))
- 结束捕获\.
- 后面跟着一个句号.*
- 后跟零个或更多任意字符
如果这不是您想要的,您可以适当调整其组件。
答案2
我使用 Ubuntu Linux 创建了一个同名文件,然后使用以下命令一起显示单词“healthcare”。
vagrant@dev:~$ ls vendor_reg_analysis_healthcare.xls | sed -e s/_/./g | cut -d '.' -f4
healthcare
该ls
命令“列出”文件名vendor_reg_analysis_healthcare.xls
。从这里我们将 的输出通过管道传输ls
到sed
并将下划线的每个实例替换为句点。为什么?因为现在我们可以使用.
作为通用分隔符,因此当我们将 的新文件名传递vendor.reg.analysis.healthcare.xls
给cut
命令时,我们现在说“剪切除第四个字段之外的所有内容”,即 这个词healthcare
。
希望这可以帮助!
答案3
.*_(.*)\..* <--- an 11 char regex
$echo vendor_reg_analysis_healthcare.xls|sed -r "s/.*_(.*)\..*/\1/"
healthcare
你必须匹配整个事物并捕捉你想要的部分。所以你必须匹配整个事物,这样你才能分割它,得到你想要的东西。
.*_
将匹配所有可能的内容,然后尝试在其后添加 _。因此 .* 也会占用许多下划线。但不会占用最后一个。因为其后的 _ 必须匹配下划线。因此匹配 vendor_reg_analysis_
现在你已经匹配到了'healthcare.xls'之前的部分
(.*)\..*
表示捕获文字点之前的所有内容,并捕获该内容。然后匹配其余部分。(.*)
这个正则表达式.*_([^.]*).*
也可以工作,我不确定它是否更快,但它有 12 个字符,所以长一个字符。