Regex101 测试:https ://regex101.com/r/Yfp311/2我很难使以下正则表达式模式起作用。对于下面的示例文本字符串,REF1 匹配整行,忽略在行中找到“//[text]”时应匹配的可选REF2 组。目前,正则表达式不承认 //[text] 并将整个文本错误地匹配为 REF1。我假设这是贪婪匹配的一个特征.. 但是我在实现非贪婪模式以及前瞻/后视(似乎没有工作)方面都没有成功。任何帮助或指导将不胜感激……不确定我遗漏了什么,因为我认为我当前的正则表达式模式应该可以正常工作。如果我能澄清任何事情,请告诉我!谢谢你!^(?P<ID>[A-Z][A-Z0-9]{3})?(?P<REF1>.+)(//(?P<REF2>.+))?(\n?(?P<EXTRA>.+))?$TEX1CNS0P5-AA//CAT-523-VID-00EOS-0XUX PETER LAB RANDOM TEXT DM5.TEX2BFTBSH9999SBRT2LRATRACE201TEX3GWS0P2-AA//D-14839048-99-3THERE WAS 200 COALS IN HIS STOCKING.预期匹配:字符串 1:编号:TEX1参考 1:CNS0P5-AA参考 2:CAT-523-VID-00EOS-0额外:XUX PETER LAB 随机文本 DM5。字符串 2:编号:TEX2参考 1:BFTBSH9999SBRT2Lref2:(不匹配,因为“//”没有出现在这个文本中)附加:RA TRACE201字符串 3:编号:TEX3参考 1:GWS0P2-AA参考 2:D-14839048-99-3额外:他的袜子里有 200 块煤。
3 回答

犯罪嫌疑人X
TA贡献2080条经验 获得超4个赞
^(?P<ID>[A-Z][A-Z0-9]{3})?(?P<REF1>[^/\n]+)(//(?P<REF2>.+))?(\n?(?P<EXTRA>.+))?$
我已经更新了它。我想它现在通过了所需的案例:
https://regex101.com/r/Yfp311/3
原始实现的问题是REF1
匹配除行终止符之外的所有内容。所以它也匹配//
。

慕姐8265434
TA贡献1813条经验 获得超2个赞
怎么样
^(?P<ID>[A-Z][A-Z0-9]{3})?(?P<REF1>[^/\n]+)(//(?P<REF2>.+))?(\n?(?P<EXTRA>.+))?$
?
我认为在这种情况下手写解析器更容易实现。

Helenr
TA贡献1780条经验 获得超4个赞
我最终发现了一个更理想的答案,因为当 REF1 文本包含单个“/”正斜杠时,提供的正则表达式模式会失败。
^(?P<ID>[A-Z][A-Z0-9]{3})?(?P<REF1>(?:(?!//).)+)(//(?P<REF2>.+))?(\n?(?P<EXTRA>.+))?$
例如 - https://regex101.com/r/Yfp311/4
TEX4POF OF 20/03/09//CAT342134832489 P/O:1600 PARK AVENUE
使用负前瞻正则表达式模式有助于解决这一差距。
添加回答
举报
0/150
提交
取消