高级条件正则表达式,具有多重捕获和外观

时间:2015-04-24 11:52:57

标签: regex regex-lookarounds

在工作中,我需要一个正则表达式来匹配一个巨大的旧目录中的不同类型的产品,这些目录是以非常糟糕的方式导入数字支持(许多错误,不同样式等)。在匹配时,我必须捕获产品的类型及其直径(括号内的值)。最后,我必须丢弃格式错误的条目(例如格式错误的条目)。

我是正则表达式的新手,这项任务让我在计划上花了太多时间。真的需要帮助!

以下是我应该和不应该匹配的内容:

YES: "product type1(0)"
YES: "product type2(923)"    
YES: "product type3(10)"
YES: "product type4(110.023) :here is a comment. It always starts with a semicolon"
YES: "product type1(14.4):comments can be just after product entry"
YES: "product type1(10.0)   : spaces are not relevant"
YES: "product type1(0000.01)   : this kind of entry is acceptable"

NO:  "product type1(asd)"
NO:  "product type1(12a3.02)" 
NO:  "product type2(0.)"
NO:  "product type2(0.123.123)"
NO:  "product type2(0...)"
NO:  "product type3(0.asd)"
NO:  "product type4(10)" comment doesn't start with a semicolon

这是我的尝试。我知道我必须用(?ifthen|else)模式和前瞻来改进它。当我尝试使用体现外观的条件正则表达式时,我的问题就出现了。我们欢迎简单的解释。

^product (type1|type2|type3|type4)\(([0-9]+\.?[0-9]+)\)[ ]+;?

谢谢。

3 个答案:

答案 0 :(得分:2)

您可以使用以下内容进行匹配:

^"(product\stype[1234]\(\d+(?:\.\d+)?\))\s*(:.*?)?"$

并将匹配项替换为$1

说明:

  • ^"(product\s以引号开头,打开捕获组,然后是product,然后是space

  • type[1234]后跟type和任意四位

  • \(\d+(?:\.\d+)?\))后跟文字(和任意数量的数字,后跟零或一个小数部分(点和数字),关闭捕获组

  • \s*(:.*?)?"$后跟额外的空格,后跟评论可能是?,也可能不是var returnCustomAttributes = type.GetMethod("Invoke").ReturnParameter.GetCustomAttributes(typeof(MarshalAsAttribute), false); ,后跟引号和字符串结尾(没有后记)

请参阅DEMO and more Explanation

答案 1 :(得分:0)

这个正则表达式对我有用:

^product (type[1234])\((\d+(\.\d+)?)\)\s*(:.*)?$

第一个捕获组应该具有类型,第二个捕获组应该具有直径。

要打破它:

[行锚的开头] [文字:“产品”] [文字:“类型”] [a 1,2,3或4] [文字左括号] [至少一位数] [可选为小数]点和至少一个数字] [文字右括号] [任何数量(包括0个字符)的空格] [可选冒号后跟任何] [行尾锚]

答案 2 :(得分:0)

我的解决方案是

^product type[1234]\((?<num>\d+(?:\.?\d+)?)\)\s*(?:$|:+)

与其他解决方案类似,但选择括号中的数字为命名组&#34; num&#34;