.net - 如何在此 RegEx 中指定可选的捕获组?

标签 .net regex

如何修复此 RegEx 以选择性地捕获文件扩展名?

我正在尝试将字符串与可选组件匹配,但似乎有问题。 (匹配的字符串来自打印机日志。)

我的正则表达式(.NET flavor )如下:

.*(header_\d{10,11}_).*(_.*_\d{8}).*(\.\w{3,4}).*
-------------------------------------------
.*                   # Ignore some garbage in the front
(header_             # Match the start of the file name,
    \d{10,11}_)      #     including the ID (10 - 11 digits)
.*                   # Ignore the type code in the middle
(_.*_\d{8})          # Match some random characters, then an 8-digit date
.*                   # Ignore anything between this and the file extension
(\.\w{3,4})          # Match the file extension, 3 or 4 characters long
.*                   # Ignore the rest of the string

我希望这可以匹配以下字符串:
str1 = "header_0000000602_t_mc2e1nrobr1a3s55niyrrqvy_20081212[1].doc [Compatibility Mode]"
str2 = "Microsoft PowerPoint - header_00000000076_d_al41zguyvgqfj2454jki5l55_20071203[1].txt"
str3 = "header_00000000076_d_al41zguyvgqfj2454jki5l55_20071203[1]"

捕获组返回的内容类似于:
$1  =  header_0000000602_
$2  =  _mc2e1nrobr1a3s55niyrrqvy_20081212
$3  =  .doc

如果未找到文件扩展名,其中 $3 可以为空。 $3 是可选部分,正如您在上面的 str3 中看到的那样。

如果我加上“?”到第三个捕获组“(.\w{3,4})?”的末尾,RegEx 不再为任何字符串捕获 $3。如果我添加“+”而不是“(.\w{3,4})+”,RegEx 将根本不再捕获 str3,这是意料之中的。

我觉得使用“?”在第三个捕获组的末尾是合适的做法,但它不像我预期的那样工作。我可能对我用来忽略部分字符串的“.*”部分太天真了。

没有按预期工作:
.*(header_\d*_).*(_.*_.{8}).*(\.\w{3,4})?.*

最佳答案

一种可能是倒数第二个.*正在贪婪。您可以尝试将其更改为:

.*(header_\d*_).*(_.*_.{8}).*?(\.\w{3,4})?.*
                             ^ Added that

这是不正确的,这个将匹配您提供的输入,但它假定第一个 .它遇到的是文件扩展名的开头:
.*(header_\d*_).*(_.*_.{8})[^\.]*(\.\w{3,4})?.*

编辑:删除我在第二个正则表达式中的转义。

关于.net - 如何在此 RegEx 中指定可选的捕获组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/488614/

相关文章:

c# - 更新绑定(bind)源后如何执行 ICommand?

c# - 数据源更改时未调用 ComboBox SelectedValueChanged

.net - 使用命令行发布 WCF 服务(或 ASP.NET Web 应用程序)

java - 正则表达式。只有一个点

java - 如何在java中实现 "supplant"

c# - .NET SqlDataReader 对象是使用数据库游标,还是将整个结果集加载到 RAM 中?

c# - 在 C# 中查看生成的源代码(在 AJAX/JavaScript 之后)

ruby-on-rails - 如何删除字符串末尾的所有 `/` 字符?

javascript - 使用 JS/NodeJS 测试并读取文件中的变量

Regex:匹配两个正则表达式