需要一个正则表达式命令

需要一个正则表达式命令

如何从单词“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。从这里我们将 的输出通过管道传输lssed并将下划线的每个实例替换为句点。为什么?因为现在我们可以使用.作为通用分隔符,因此当我们将 的新文件名传递vendor.reg.analysis.healthcare.xlscut命令时,我们现在说“剪切除第四个字段之外的所有内容”,即 这个词healthcare

希望这可以帮助!

答案3

.*_(.*)\..*    <--- an 11 char regex 


$echo vendor_reg_analysis_healthcare.xls|sed -r "s/.*_(.*)\..*/\1/"
healthcare

你必须匹配整个事物并捕捉你想要的部分。所以你必须匹配整个事物,这样你才能分割它,得到你想要的东西。

.*_ 将匹配所有可能的内容,然后尝试在其后添加 _。因此 .* 也会占用许多下划线。但不会占用最后一个。因为其后的 _ 必须匹配下划线。因此匹配 vendor_reg_analysis_

现在你已经匹配到了'healthcare.xls'之前的部分

(.*)\..*

表示捕获文字点之前的所有内容,并捕获该内容。然后匹配其余部分。(.*)

这个正则表达式.*_([^.]*).* 也可以工作,我不确定它是否更快,但它有 12 个字符,所以长一个字符。

相关内容