具有多重捕获和环视的高级条件正则表达式
advanced conditional regex with multi capturing and 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)
模式和前瞻来改进它。当我尝试使用包含 lookhaed 的条件正则表达式时,我的问题就出现了。欢迎简单说明。
^product (type1|type2|type3|type4)\(([0-9]+\.?[0-9]+)\)[ ]+;?
谢谢。
您可以使用以下方式进行匹配:
^"(product\stype[1234]\(\d+(?:\.\d+)?\))\s*(:.*?)?"$
并将匹配项替换为 </code></p>
<p>解释:</p>
<ul>
<li><p><code>^"(product\s
以引号开头,打开捕获组,然后是 product
,然后是 space
type[1234]
后跟 type
和四位数字中的任意一位
\(\d+(?:\.\d+)?\))
后跟文字 (
和任意数量的数字,后跟零或一次小数部分(点和数字),关闭捕获组
\s*(:.*?)?"$
后跟额外的 space,后跟注释可能是也可能不是 ?
,然后是引号和字符串结尾(无后记)
这个正则表达式适合我:
^product (type[1234])\((\d+(\.\d+)?)\)\s*(:.*)?$
第一个捕获组应该有类型,第二个应该有直径。
分解:
[行锚点开始][文字:"product "][文字:"type"][1、2、3 或 4][文字开括号][至少一个数字][可选的小数点和至少一个数字][文字右括号][任意数量(包括 0 个字符)的空格][可选的冒号后跟任何内容][行尾锚点]
我的解决方案是
^product type[1234]\((?<num>\d+(?:\.?\d+)?)\)\s*(?:$|:+)
这与其他解决方案类似,但将大括号中的数字选择到命名组中 "num"
在工作中,我需要一个正则表达式来匹配一个巨大的旧目录中的不同种类的产品,该目录以非常糟糕的方式导入数字支持(很多错误、不同的样式等)。匹配时,我必须捕获产品的类型及其直径(括号内的值)。最后,我必须丢弃格式错误的条目(例如注释格式错误的条目)。
我是正则表达式的新手,这个任务真的占用了我太多的时间在我的计划上。真的需要帮助!
这是我应该和不应该匹配的:
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)
模式和前瞻来改进它。当我尝试使用包含 lookhaed 的条件正则表达式时,我的问题就出现了。欢迎简单说明。
^product (type1|type2|type3|type4)\(([0-9]+\.?[0-9]+)\)[ ]+;?
谢谢。
您可以使用以下方式进行匹配:
^"(product\stype[1234]\(\d+(?:\.\d+)?\))\s*(:.*?)?"$
并将匹配项替换为 </code></p>
<p>解释:</p>
<ul>
<li><p><code>^"(product\s
以引号开头,打开捕获组,然后是 product
,然后是 space
type[1234]
后跟 type
和四位数字中的任意一位
\(\d+(?:\.\d+)?\))
后跟文字 (
和任意数量的数字,后跟零或一次小数部分(点和数字),关闭捕获组
\s*(:.*?)?"$
后跟额外的 space,后跟注释可能是也可能不是 ?
,然后是引号和字符串结尾(无后记)
这个正则表达式适合我:
^product (type[1234])\((\d+(\.\d+)?)\)\s*(:.*)?$
第一个捕获组应该有类型,第二个应该有直径。
分解:
[行锚点开始][文字:"product "][文字:"type"][1、2、3 或 4][文字开括号][至少一个数字][可选的小数点和至少一个数字][文字右括号][任意数量(包括 0 个字符)的空格][可选的冒号后跟任何内容][行尾锚点]
我的解决方案是
^product type[1234]\((?<num>\d+(?:\.?\d+)?)\)\s*(?:$|:+)
这与其他解决方案类似,但将大括号中的数字选择到命名组中 "num"