我正在尝试编写一个基于规则的逻辑来从文本中提取信息。我需要将每个提取的字符串分配给每个特定案例。但是,我被困在负向前瞻用例中。我需要找到一个单词“cash”,后跟“rp”或“idr”,然后是数字,这些数字可以包含“。”、”或数字中的任何空格,但不能跟独立的“juta|jt|m”。
这是我迄今为止的工作:
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
- 一个字符串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