正则表达式在文件扩展名后删除字符串

时间:2016-02-09 16:11:02

标签: regex windows powershell

我正在使用PowerShell查询服务路径,其结果应类似于C:\ directory \ sub-directory \ service.exe

但是某些结果还包括.exe文件扩展名后面的字符,例如输出可能类似于以下内容之一:

  • C:\ directory \ sub-directory \ service.exe ThisTextNeedsRemoving
  • C:\ directory \ sub-directory \ service.exe -ThisTextNeedsRemoving
  • C:\ directory \ sub-directory \ service.exe / ThisTextNeedsRemoving

即。 ThisTextNeedsRemoving可以用空格,连字符或正斜杠进行。

我可以使用regex -replace'($ *。exe)。*'删除之后的所有内容,但包括.exe文件扩展名,但如何在结果中保留.exe?

2 个答案:

答案 0 :(得分:3)

您可以使用环顾:

import org.apache.commons.io.FileUtils;

File myFile = new File("/path/to/your/file.csv");
String source = FileUtils.readFileToString(myFile);
String withoutSpaces = source.replaceAll(" ","");
FileUtils.writeStringToFile(myFile,withoutSpaces); 

这使用了一个零宽度匹配的后视镜,因此它不会被替换。

Regular expression visualization

Debuggex Demo

答案 1 :(得分:2)

使用lookbehind是可能的,但请注意,只有当您需要指定一些相当复杂的条件或获得重叠匹配时才需要lookbehinds。在大多数情况下,当你可以做到没有外观时,你应该考虑使用非外观解决方案,因为它是一个相当昂贵的操作。如果当前字符不是空格而不是检查每个符号是否都在其他之前,则更容易检查一次。或整个子字符串,或更完整的模式。

因此,我建议使用基于捕获机制的解决方案,在替换部分中使用反向引用来恢复结果中捕获的子字符串:

$s -replace '^(\S+\.exe) .*','$1'

或 - 对于包含空格而不是双引号的路径:

$s -replace '^(.*?\.exe) .*','$1'

<强>解释

  • ^ - 字符串开头
  • (\S+\.exe) - 除了空格(\S+)之外的一个或多个字符(或换行以外的任何字符,任意数量,尽可能少的字符,.*?)后跟一个字符文字.exe
  • .* - 一个空格,然后是换行符以外的任意数量的字符。

enter image description here