3

我有这个 ABAP 代码通过正则表达式查找文本:

DATA: regex            TYPE REF TO cl_abap_regex,
      match            TYPE REF TO cl_abap_matcher,
      match_result_tab TYPE match_result_tab.
TRY.
    CREATE OBJECT regex
      EXPORTING
        pattern = '01|012345'.
  CATCH cx_sy_regex .
ENDTRY.

TRY.
    CREATE OBJECT match
      EXPORTING
        regex = regex
        text  = '0123456'.
  CATCH cx_sy_matcher.
ENDTRY.

CALL METHOD match->find_all
  RECEIVING
    matches = match_result_tab.

它找到“01”(但我希望找到“012345”)。

DATA: offset TYPE i, length TYPE i.

FIND REGEX '01|012345' IN '0123456'
  MATCH OFFSET offset
  MATCH LENGTH length.

它发现012345如我所料。

有人可以解释为什么结果不同。

4

2 回答 2

2

CL_ABAP_REGEX与带有 word 的内置 ABAP 语句的行为不同REGEX,这是一个记录在案的功能

除了正则表达式(根据扩展的 POSIX 标准 IEEE 1003.1),类 CL_ABAP_REGEX 还提供了另一种具有受限功能的简化正则表达式。这些简化的正则表达式(也称为简化表达式)不支持所有 POSIX 运算符,并且在某些部分使用略有不同的语法。但是,正则表达式和简化表达式的语义是相同的。

因此,实现方式不同如下:

  • CL_ABAP_REGEX不是“贪婪的替代品”(搜索01|01210121匹配01),而是贪婪的简单文本(搜索0.*10101匹配0101
  • 带有单词的 ABAP 语句对REGEX替代项(搜索将匹配)和简单文本(搜索将匹配)贪婪01|0121012101210.*101010101

PS:

  • 我认为这门课CL_ABAP_REGEX变得有点没用了;有新的有用功能,如match, matches, contains,replace等。也许它的功能现在都被新功能覆盖了。
  • 我无法告诉您是否CL_ABAP_REGEX正确实现了“扩展 POSIX 标准 IEEE 1003.1”;您可能会对有关 POSIX 是什么的信息或讨论感兴趣,请点击此处此处此处
于 2019-07-05T16:17:15.343 回答
0

你试过这个:

  CREATE OBJECT regex
    EXPORTING
     pattern     = '012345|01'.

第一击获胜。

如果我执行这个:

REPORT  Z_TEST.

data:
  regex type REF TO CL_ABAP_REGEX,
  match type ref to CL_ABAP_MATCHER,
  match_result_tab type match_result_tab.

CREATE OBJECT regex EXPORTING pattern = '012345|01'.
CREATE OBJECT match EXPORTING regex = regex text = '0123456'.

call METHOD match->find_all RECEIVING matches = match_result_tab.

data:
  regex2 type REF TO CL_ABAP_REGEX,
  match2 type ref to CL_ABAP_MATCHER,
  match_result_tab2 type match_result_tab.
CREATE OBJECT regex2 EXPORTING pattern = '01|012345'.
CREATE OBJECT match2 EXPORTING regex = regex2 text = '0123456'.

call METHOD match2->find_all RECEIVING matches = match_result_tab2.

我得到: 在此处输入图像描述

随着012345|01你捕获所有你想要的值,01|012345你只得到01.

于 2013-11-04T11:39:58.020 回答