3

我在编写正则表达式时遇到了一些麻烦。

我必须从字符串中提取一些信息并识别其中非常具体的部分。

所有部分都不是强制性的。

我的格式是:ORDER_filename.extension(options)wherefilename是强制性的,andORDERextensionareoptions不是。

例如,我可能有:

100_Some file name.ext(3)
_Some other file name.ext
300_Folder name
400_Another Folder name(5)

我应该能够提取:

Order  |   Filename                 |  extension | options
----------------------------------------------------------
100    |   Some file name           |  ext       | 3
(null) |   _Some other file name    |  ext       | (null)
300    |   Folder name              |  (null)    | (null)
400    |   Another Folder name      |  (null)    | 5

第二行在文件名中下划线。

我正在玩一些正则表达式库,但我没有成功提取我的所有部分。

我试过了:

  • ^(?<order>[0-9_]+_)?(?<filename>\w+): 但它在空间分割文件名
  • ^(?<order>[0-9_]+_)?(?<filename>\w+)(\.(?<ext>.+))?: 没有提取扩展名。文件名仍然是拆分的。
  • ^(?<order>[0-9_]+_)?(?<filename>\w+)(\.(?<ext>.+))?(\((?<options>.+)\))?:既不提取扩展名,也不提取选项。文件名仍然是拆分的。

我应该使用什么正确的表达方式?

仅供参考,我将使用名为 captures 的 C# 来使用这些值完成一些工作。

4

2 回答 2

4

没关系,

我误解了\w别名。这不包括空格。

此表达式按预期工作:

^(?<order>[0-9_]+_)?(?<filename>(\w|\s)+)(\.(?<ext>\w+))?(\((?<options>.+)\))?

[编辑]不幸的是,在某些情况下会爆炸:

100_some file() name.doc(3)
于 2013-05-03T16:13:16.417 回答
3

您可以使用如下表达式:

var re = @"(?xm)
    ^
    (?:    (?<order> \d+ ) _ )?
           (?<filename> .+? )
    (?: \. (?<ext> \w+ ) )?
    (?: \( (?<options> [^()]+ ) \) )?
    $";
于 2013-05-03T16:32:26.687 回答