首页 > 解决方案 > 在最后一个反斜杠之后提取第一个非点文本字符串

问题描述

有人可以帮我从下面提供的字符串中提取粗体文本“england”吗

\ABCD\E$\FGHI$\BAB-COM-DEP_XYZ\TAM\england.CLSM.IST

我试过了\\.*?\.,但后来我得到了

\ABCD\E$\FGHI$\BAB-COM-DEP_XYZ\TAM\england.

任何帮助将不胜感激

标签: regexpowershell

解决方案


在 Powershell 中,您可以获取不带扩展名的文件名,将字符串拆分.并获取第一个项目:

PS> $s = '\ABCD\E$\FGHI$\BAB-COM-DEP_XYZ\TAM\england.CLSM.IST'
PS> [System.IO.Path]::GetFileNameWithoutExtension($s).Split('.')[0]
england

如果您出于某种原因需要正则表达式,我建议使用

.*\\([^.]+)

并获取第 1 组值。请参阅正则表达式演示

细节

  • .*\\- 匹配所有文本直到并包括最后一个\字符(因为.*是一个贪婪的子模式)
  • ([^.]+)- 第 1 组:一个或多个字符.

另一种正则表达式可能看起来像

([^.\\]+)[^\\]*$

查看另一个正则表达式演示

细节

  • ([^.\\]+).- 第 1 组:除and之外的一个或多个字符\
  • [^\\]*$- 0 个或更多字符\,直到字符串 ( $) 的末尾。

Powershell 用法

PS> $s -match '([^.\\]+)[^\\]*$' | Out-Null
PS> $matches[1]
england

如果您需要一个直接返回所需字符串的正则表达式,您可以使用

 $s -replace '.*\\([^\\.]+)[^\\]*$', '$1'

查看.NET 正则表达式演示

  • .*- 尽可能多地匹配任何 0+ 个字符
  • \\- 一个\字符
  • ([^\\.]+)- 第 1 组(用 引用):匹配并使用除and$1之外的一个或多个字符\.
  • [^\\]*$- 除\( [^\\]*) 和字符串结尾 ( $) 之外的 0+ 个字符。

推荐阅读