我正在尝试编写基于规则的逻辑来从文本中提取信息。我需要将每个提取的字符串分配给每个特定情况。然而,我一直在处理消极的前瞻用例。我需要找到一个单词“cash”,后跟“rp”或“idr”,然后是可以包含“.”、“,”或数字中任何空格的数字,但后面不能跟独立的“juta|” jt|米”。
这是我迄今为止的工作:
cash\s*[\:,.-]?\s*(rp|idr)[\.,]?\s*([\d\s,.]+)(?!juta|jt|m)\b
这些是测试用例:
harga cash: rp 130jt (nego alu
harga cash: rp 230juta (nego alu
harga cash: rp 330 juta (nego alu
harga cash: rp 430,000,000 juta (nego alu
harga cash: rp 530m (nego alu
harga cash: rp 630 (nego alu
harga cash: rp 730000000 (nego alu
harga cash: rp 830,000,000 (nego alu
harga cash: rp 930 000 000 (nego alu
正则表达式错误地匹配所有这些行,而它应该只匹配最后四行并产生:
cash: rp 630
cash: rp 730000000
cash: rp 830,000,000
cash: rp 930 000 000
因此,数字后面带有
juta
、jt
和 m
的所有字符串都不应该被匹配。谁能指出我哪里做错了?
如果右侧有以
(?!juta|jt|m)\b
、juta
或 it
开头的单词,则 m
模式匹配失败,但前面的模式 [\d\s,.]+
允许回溯,因此可以重新设置前向限制- 在文本上触发[\d\s,.]+
模式匹配,因此你会得到额外的匹配。此外,正则表达式现在还尝试匹配右侧的空格,如果要排除的单词出现在空格之后,这些字符串也将被匹配。此外,依赖单词边界在这里没有帮助,因为回溯可以找到逗号或点之前的数字。
因此,修复正则表达式有两个主要建议:
(?!\S)
,而不是单词边界,以便将数字与逗号/点匹配。图案看起来像
cash\s*[:,.-]?\s*(rp|idr)[.,]?\s*(\d(?:[\d\s,.]*\d)?)(?!\S)(?!\s*(?:juta|jt|m)\b)
请参阅 正则表达式演示。
详情:
cash
- 字符串 cash
\s*
- 零个或多个空格[:,.-]?
- 可选出现 :
、,
、.
或 -
\s*
- 零个或多个空格(rp|idr)
- 第 1 组:rp
或 idr
弦乐[.,]?
- 可选出现 .
或 ,
\s*
- 零个或多个空格(\d(?:[\d\s,.]*\d)?)
- 第 2 组:一个数字,然后可选出现零个或多个数字、空格、逗号或点,然后是一个数字(?!\S)
- 右侧不允许有空格(?!\s*(?:juta|jt|m)\b)
- 另外,在右侧,不应有零个或多个空格,后面跟着 juta
、jt
或 m
单词(它们现在后面有单词边界)。如果要匹配以 juta
、
jt
、
m
开头的单词,请删除单词边界。