我需要提取在'PO#‘或'PO#’之后紧跟在4-10位之间的任何数字(带有空格)。我不想将提取的实际值包含在PO#中,但是我确实需要它作为标准来针对字符串中的值。如果数字小于4或大于10,我不希望捕获该值,否则将忽略它。
示例字符串如下所示:
面向供应商企业的PO#12445
或
Invoice# 21412556面向供应商企业的PO# 12445
我当前的RegEX表达式用'#‘捕获PO#,并且在事实之后使用额外的逻辑来删除'#',但是我的表达式也捕获了Invoice#和Inv#,这是我不希望它做的。我希望它只针对PO#。
当前表达式: P#\s*0-9{3,9}\d+\w
任何帮助都将不胜感激!
发布于 2020-10-20 06:36:29
如果只需要数字,则可以使用\b(?<=PO#)\s?(\d{4,10})\b,并:
(?<=PO#):正向后看,请确保此模式在所需模式之前存在(PO后面跟着#)\s?:0或1个空白(\d{4,10}):介于4到10位之间\b:避免ie的词界。11位模式匹配的10位头位或匹配的“SPO#”编辑: Alexander说得对,看后面的东西必须是固定的宽度,所以\b(?<=PO#)\s?(\d{4,10})\b是更好的https://regex101.com/r/1KBQd1/5。
编辑:添加单词边界
发布于 2020-10-20 06:35:02
您可以使用捕获组和重复匹配数字4-10次使用[0-9]{4,10}.
请注意,[P][O][#]与PO#相同
\bPO#\s*([0-9]{4,10})\b\bPO#\s*匹配PO#前面有一个单词边界,并匹配0+空格字符( Capture group 1 [0-9]{4,10}匹配4-10位数)\b关闭组后面跟着一个单词边界,以防止匹配成为较大单词的一部分。发布于 2020-10-20 07:05:11
如果PCRE可用,不如:PO#\s*\K\d{4,10}(?=\D|$)
PO#\s*匹配前面的子字符串"PO#“,后面跟着0或更多的空格。\K重置匹配的起始位置,并作为正(零长度)后视。\d{4,10}匹配4 <=长度<= 10的数字序列。(?=\D|$)是用于匹配非数字字符或字符串末尾的正前瞻。https://stackoverflow.com/questions/64439533
复制相似问题