独立单词的否定前瞻

问题描述 投票:0回答:1

我正在尝试编写基于规则的逻辑来从文本中提取信息。我需要将每个提取的字符串分配给每个特定情况。然而,我一直在处理消极的前瞻用例。我需要找到一个单词“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
的所有字符串都不应该被匹配。谁能指出我哪里做错了?

regex regex-group
1个回答
0
投票

如果右侧有以

(?!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
     开头的单词,请删除单词边界。
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.