正则表达问题

时间:2013-05-03 16:10:04

标签: c# regex

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

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

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

我的格式为:ORDER_filename.extension(options)其中filename是强制性的,而ORDERextensionoptions则不是。

例如,我可能有:

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

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

我正在玩regex lib一点,但我没有成功提取我的所有部分。

我试过了:

  • ^(?<order>[0-9_]+_)?(?<filename>\w+):但它会在空格处分割文件名
  • ^(?<order>[0-9_]+_)?(?<filename>\w+)(\.(?<ext>.+))?:未提取任何扩展名。文件名仍然是分开的。
  • ^(?<order>[0-9_]+_)?(?<filename>\w+)(\.(?<ext>.+))?(\((?<options>.+)\))?:既未提取扩展名也未提取选项。文件名仍然是分开的。

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

仅供参考,我将使用C#命名的捕获来使用这些值做一些工作。

2 个答案:

答案 0 :(得分:4)

没关系,

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

此表达式按预期工作:

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

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

100_some file() name.doc(3)

答案 1 :(得分:3)

您可以使用如下表达式:

var re = @"(?xm)
    ^
    (?:    (?<order> \d+ ) _ )?
           (?<filename> .+? )
    (?: \. (?<ext> \w+ ) )?
    (?: \( (?<options> [^()]+ ) \) )?
    $";