我在编写正则表达式时遇到了一些麻烦。
我必须从字符串中提取一些信息并识别其中的非常具体的部分。
所有部分都不是强制性的。
我的格式为:ORDER_filename.extension(options)
其中filename
是强制性的,而ORDER
,extension
和options
则不是。
例如,我可能有:
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#命名的捕获来使用这些值做一些工作。
答案 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> [^()]+ ) \) )?
$";