Regular Expressions 101

Save & Share

Flavor

  • PCRE2 (PHP >=7.3)
  • PCRE (PHP <7.3)
  • ECMAScript (JavaScript)
  • Python
  • Golang
  • Java 8
  • .NET 7.0 (C#)
  • Rust
  • Regex Flavor Guide

Function

  • Match
  • Substitution
  • List
  • Unit Tests

Tools

Sponsors
There are currently no sponsors. Become a sponsor today!
An explanation of your regex will be automatically generated as you type.
Detailed match information will be displayed here automatically.
  • All Tokens
  • Common Tokens
  • General Tokens
  • Anchors
  • Meta Sequences
  • Quantifiers
  • Group Constructs
  • Character Classes
  • Flags/Modifiers
  • Substitution
  • A single character of: a, b or c
    [abc]
  • A character except: a, b or c
    [^abc]
  • A character in the range: a-z
    [a-z]
  • A character not in the range: a-z
    [^a-z]
  • A character in the range: a-z or A-Z
    [a-zA-Z]
  • Any single character
    .
  • Alternate - match either a or b
    a|b
  • Any whitespace character
    \s
  • Any non-whitespace character
    \S
  • Any digit
    \d
  • Any non-digit
    \D
  • Any word character
    \w
  • Any non-word character
    \W
  • Non-capturing group
    (?:...)
  • Capturing group
    (...)
  • Zero or one of a
    a?
  • Zero or more of a
    a*
  • One or more of a
    a+
  • Exactly 3 of a
    a{3}
  • 3 or more of a
    a{3,}
  • Between 3 and 6 of a
    a{3,6}
  • Start of string
    ^
  • End of string
    $
  • A word boundary
    \b
  • Non-word boundary
    \B

Regular Expression

/
/
ig

Test String

Code Generator

Generated Code

# coding=utf8 # the above tag defines encoding for this document and is for Python 2.x compatibility import re regex = r"(?<=method ).+?(?=\.)" test_str = ("CLASS zcl_re7_upd_ctrl DEFINITION\n" " PUBLIC\n" " CREATE PUBLIC .\n\n" " PUBLIC SECTION.\n\n" " CONSTANTS gc_deleted_m_type TYPE rebdmeas VALUE 'W001'. \"#EC NOTEXT\n" " CONSTANTS gc_deleted_m_value TYPE rebdmeasvalue VALUE 0. \"#EC NOTEXT\n\n" " METHODS fill_log_from_bapiret2\n" " IMPORTING\n" " !bapi_return TYPE bapiret2_t .\n" " METHODS constructor\n" " IMPORTING\n" " !obj_type TYPE string\n" " !mode TYPE string\n" " !window_start_date TYPE datum\n" " !window_end_date TYPE datum\n" " !last_update_ts TYPE tzntstmpl \"Timestamp of last update\n" " .\n" " METHODS main .\n" " CLASS-METHODS gen_next_window_start_date\n" " IMPORTING\n" " !obj_type TYPE string\n" " !last_update_ts TYPE tzntstmpl \"Timestamp of last update\n" " RETURNING\n" " VALUE(next_window_start_date) TYPE datum .\n" " CLASS-METHODS gen_init_window_start_date\n" " IMPORTING\n" " !window_end_date TYPE datum\n" " RETURNING\n" " VALUE(window_start_date) TYPE datum .\n" " PROTECTED SECTION.\n" " PRIVATE SECTION.\n" " CONSTANTS gc_login_app TYPE string VALUE 'fpp_ena' ##NO_TEXT.\n" " CONSTANTS gc_login_lang TYPE string VALUE 'pl' ##NO_TEXT.\n" " CONSTANTS gc_login_user TYPE string VALUE 'sap' ##NO_TEXT.\n" " CONSTANTS gc_login_password TYPE string VALUE 'IVNhcFNlcnZpY2U1Kg==' ##NO_TEXT.\n" " CLASS-METHODS init_log\n" " RETURNING\n" " VALUE(go_log) TYPE REF TO if_reca_message_list.\n\n" " DATA go_log TYPE REF TO if_reca_message_list .\n" " DATA buffer TYPE zre_t_measur_buf_tab .\n" " DATA last_update_ts TYPE tzntstmpl .\n" " DATA obj_type TYPE string .\n" " DATA m_type TYPE rebdmeas . \" TODO: move to subclass\n" " DATA proxy TYPE REF TO zre7_co_si_get_ln_lngths_so .\n" " DATA mode TYPE string .\n" " DATA window_start_date TYPE datum .\n" " DATA window_end_date TYPE datum .\n" " DATA received_ts TYPE tzntstmpl.\n" " DATA tz TYPE timezone.\n" " DATA status_rec TYPE zre_t_measur_sta.\n" " DATA:\n" " is_line TYPE boolean,\n" " is_building TYPE boolean,\n" " is_property TYPE boolean\n" " .\n" " DATA current_ts TYPE tzntstmpl.\n" "* DATA go_events TYPE REF TO lcl_handle_events.\n\n" " METHODS process_building\n" " IMPORTING\n" " !building_obj TYPE REF TO if_rebd_building\n" " !value TYPE rebdmeasvalue\n" " !unit TYPE rebdmeasunit\n" " RAISING\n" " zcx_re1_exception .\n" " METHODS calc_valid_period_for_building\n" " EXPORTING\n" " !valid_from TYPE recadatefrom\n" " !valid_to TYPE recadateto .\n" " METHODS commit_changes .\n" " METHODS process .\n" " METHODS read_buffer .\n" " METHODS download_data_to_buffer\n" " IMPORTING\n" " update_timestamp TYPE any OPTIONAL\n" " RAISING\n" " zcx_re1_exception .\n" " METHODS create_proxy .\n" " METHODS clean_buffer\n" " IMPORTING\n" " processed TYPE zre_t_measur_buf_tab.\n" " METHODS finish.\n" " METHODS store_data_in_buffer\n" " IMPORTING\n" " received_data TYPE zre7_get_ln_lngths_resp_lc_tab\n" " update_timestamp TYPE tzntstmpl\n" " window_start_date TYPE datum\n" " window_end_date TYPE datum\n" " .\n" " METHODS init_status_record.\n" " METHODS setup_new_window_dates.\n" " METHODS display_buffor\n" " IMPORTING\n" " buffer TYPE zre_t_measur_buf_tab.\n" "ENDCLASS.\n\n\n\n" "CLASS zcl_re7_upd_ctrl IMPLEMENTATION.\n\n\n" " METHOD calc_valid_period_for_building.\n" " DATA next_year TYPE char4.\n" " DATA next_year_i TYPE integer.\n\n" " next_year = me->window_end_date(4).\n" " next_year_i = next_year.\n" " next_year_i = next_year_i + 1.\n" " next_year = next_year_i.\n\n" " valid_from = next_year && '0101'.\n" " valid_to = valid_from.\n\n" " ENDMETHOD.\n\n\n" " METHOD clean_buffer.\n" " zcl_re7_storage_gateway=>clean_buffer( processed ).\n" " ENDMETHOD.\n\n\n" " METHOD commit_changes.\n" " DATA: ls_return TYPE bapiret2.\n\n" "* * W zależności od trybu wykonania zrób commit albo rolback i wyświetl raport\n" "* IF p_exetyp = 'S'.\n" "*\n" "* * Do nothing - rollback not needed, BAPI_RE_BU_CHANGE run in simulation mode\n" "*\n" "* ELSEIF p_exetyp = 'E'.\n\n" " CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'\n" " EXPORTING\n" " wait = abap_true\n" " IMPORTING\n" " return = ls_return.\n\n" " IF ls_return-type CA 'EAX'.\n" " CALL METHOD me->go_log->add_from_bapi\n" " EXPORTING\n" " is_bapiret = ls_return.\n" " ENDIF.\n\n" " ENDMETHOD.\n\n\n" " METHOD constructor.\n" " DATA l_ts TYPE tzntstmpl.\n" " DATA: l_window_start_date TYPE datum,\n" " lcx TYPE REF TO zcx_re1_exception.\n\n" " IF mode = 'download' OR mode = 'view' OR mode = 'buffer'.\n" " ELSE.\n" " MESSAGE 'API error: Incorrect usage of class zcl_re7_upd_ctrl - mode must be one of: download, view, buffer.' TYPE 'E'.\n" " ENDIF.\n\n" "* CREATE OBJECT update_controller.\n" " me->mode = mode.\n\n" " IF obj_type = 'line' OR obj_type = 'building' OR obj_type = 'property'.\n" " ELSE.\n" " MESSAGE 'API error: Incorrect usage of class zcl_re7_upd_ctrl - obj_type must be one of: line, building or property.' TYPE 'E'.\n" " ENDIF.\n" " me->obj_type = obj_type.\n\n" " CALL FUNCTION 'GET_SYSTEM_TIMEZONE' IMPORTING timezone = me->tz EXCEPTIONS customizing_missing =1.\n\n\n" " me->go_log = zcl_re7_upd_ctrl=>init_log( ).\n\n\n" " me->last_update_ts = last_update_ts.\n\n" " CONVERT DATE sy-datum TIME sy-uzeit INTO TIME STAMP me->current_ts TIME ZONE me->tz.\n\n" " IF mode <> 'download'.\n" " IF last_update_ts IS INITIAL.\n" " MESSAGE 'API error: Incorrect usage of class zcl_re7_upd_ctrl - if processing buffer, ts must not be empty.' TYPE 'E'.\n" " ENDIF.\n" " ELSE.\n" " ENDIF.\n\n" " me->window_start_date = window_start_date.\n" " me->window_end_date = window_end_date.\n\n\n" " ENDMETHOD.\n\n\n" " METHOD create_proxy.\n" " ENDMETHOD.\n\n\n" " METHOD display_buffor.\n\n" " DATA:\n" " ls_key TYPE salv_s_layout_key,\n" " lo_salv_msg TYPE REF TO cx_salv_msg,\n" " lo_table TYPE REF TO cl_salv_table,\n" " lo_cols TYPE REF TO cl_salv_columns_table,\n" " lo_events TYPE REF TO cl_salv_events_table,\n" " lo_funcs TYPE REF TO cl_salv_functions_list,\n" " lo_layout TYPE REF TO cl_salv_layout,\n" " lo_display TYPE REF TO cl_salv_display_settings,\n\n" " lt_buffer LIKE buffer.\n\n" " lt_buffer = buffer.\n\n\n" " TRY.\n" " CALL METHOD cl_salv_table=>factory(\n" " IMPORTING\n" " r_salv_table = lo_table\n" " CHANGING\n" " t_table = lt_buffer ).\n" " CATCH cx_salv_msg INTO lo_salv_msg.\n" " CLEAR lo_table.\n" " CALL METHOD cl_reca_message_services=>raise_from_exception\n" " EXPORTING\n" " io_exception = lo_salv_msg\n" " EXCEPTIONS\n" " error = 1\n" " OTHERS = 2.\n" " IF sy-subrc <> 0.\n" " MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno\n" " WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4\n" " DISPLAY LIKE sy-msgty.\n" " ENDIF.\n" " RETURN.\n" " ENDTRY .\n\n" "** Include own functions by setting own status\n" "* lo_table->set_screen_status(\n" "* pfstatus = 'STATUS_1'\n" "* report = sy-repid\n" "* set_functions = lo_table->c_functions_all ).\n\n" "** Events\n" "* lo_events = lo_table->get_event( ).\n" "* CREATE OBJECT go_events.\n" "** Register to the event USER_COMMAND\n" "* SET HANDLER go_events->on_user_command FOR lo_events.\n" "** Register to the event DOUBLE_CLICK\n" "* SET HANDLER go_events->on_double_click FOR lo_events.\n" "*\n\n" "* Layouts\n" " ls_key-report = sy-repid.\n" " lo_layout = lo_table->get_layout( ).\n" " lo_layout->set_key( ls_key ).\n" " lo_layout->set_default( abap_true ).\n" " lo_layout->set_save_restriction( ).\n\n" " lo_cols = lo_table->get_columns( ).\n" " lo_cols->set_optimize( abap_true ).\n\n" "* Functions\n" " lo_funcs = lo_table->get_functions( ).\n" " lo_funcs->set_all( abap_true ).\n\n" "* Display Settings\n" " lo_display = lo_table->get_display_settings( ).\n" " lo_display->set_striped_pattern( abap_true ).\n\n" "* Display ALV\n" " lo_table->display( ).\n\n" " ENDMETHOD.\n\n\n" " METHOD download_data_to_buffer.\n" " DATA:\n" " exception_ref TYPE REF TO cx_ai_system_fault,\n" " exception_ref_a TYPE REF TO cx_ai_application_fault,\n" " lcx TYPE REF TO zcx_re1_exception,\n" " l_exception_msg TYPE string,\n\n" " wa_output TYPE zre7_get_ln_lngths_rq_lcl,\n" " wa_input TYPE zre7_get_ln_lngths_resp_lcl,\n" " lv_message TYPE string,\n" " exception_ref_root TYPE REF TO cx_root,\n" " tz TYPE timezone.\n\n" " MESSAGE s006(zre7) WITH me->window_start_date me->window_end_date INTO lv_message.\n" " me->go_log->add_symsg( ).\n\n" " wa_output-get_line_lengths_request_local-date_from = me->window_start_date.\n" " wa_output-get_line_lengths_request_local-date_to = me->window_end_date.\n" " wa_output-get_line_lengths_request_local-login-app = gc_login_app.\n" " wa_output-get_line_lengths_request_local-login-lang = gc_login_lang.\n" " wa_output-get_line_lengths_request_local-login-user = gc_login_user.\n" " wa_output-get_line_lengths_request_local-login-password = gc_login_password.\n\n" " TRY .\n" " CREATE OBJECT me->proxy.\n" " me->proxy->si_get_line_lengths_sync_out( EXPORTING\n" " output = wa_output\n" " IMPORTING\n" " input = wa_input\n" " ).\n\n" " IF wa_input-get_ln_lngths_resp_lcl-status-status_code = 'OK'.\n" " DATA(received_count) = lines( wa_input-get_ln_lngths_resp_lcl-row ) .\n" " MESSAGE s010(zre7) WITH received_count INTO lv_message.\n" " me->go_log->add_symsg( ).\n\n" "* received_ts = wa_input-get_ln_lngths_resp_lcl-status-time_stamp.\n" " received_ts = me->current_ts.\n\n" " zcl_re7_storage_gateway=>save_sta_record( me->status_rec ).\n" " me->store_data_in_buffer(\n" " received_data = wa_input-get_ln_lngths_resp_lcl-row\n" " update_timestamp = received_ts\n" " window_start_date = me->window_start_date\n" " window_end_date = me->window_end_date\n" " ).\n\n" " COMMIT WORK.\n\n" " MESSAGE s011(zre7) INTO lv_message.\n" " me->go_log->add_symsg( ).\n\n" " COMMIT WORK.\n" "* me->last_update_ts = received_ts.\n\n" " ELSE.\n" " lcx = zcx_re1_exception=>create( ).\n\n" " MESSAGE e007(zre7) INTO lv_message.\n" " me->go_log->add_symsg( ).\n" " MESSAGE e008(zre7) WITH wa_input-get_ln_lngths_resp_lcl-status-error_reason wa_input-get_ln_lngths_resp_lcl-status-debug_msg\n" " INTO lv_message.\n" " me->go_log->add_symsg( ).\n" " lcx->add_sy( ).\n" " RAISE EXCEPTION lcx.\n\n" " ENDIF.\n\n" "* TODO: extract message logging into sep meth. and fix shortened longtext\n" " CATCH cx_ai_system_fault INTO exception_ref.\n" " l_exception_msg = exception_ref->get_text( ).\n" " WRITE: 'AI SYSTEM:', l_exception_msg.\n" " lcx = zcx_re1_exception=>create( ).\n\n" " MESSAGE e007(zre7) INTO lv_message.\n" " me->go_log->add_symsg( ).\n" " MESSAGE e008(zre7) WITH 'cx_ai_system_fault' l_exception_msg INTO lv_message.\n" " me->go_log->add_symsg( ).\n" " lcx->add_sy( ).\n" " RAISE EXCEPTION lcx.\n\n" " CATCH cx_ai_application_fault INTO exception_ref_a.\n" " l_exception_msg = exception_ref->get_longtext( ).\n" " WRITE: 'AI APP:', l_exception_msg.\n" " MESSAGE e007(zre7) INTO lv_message.\n" " me->go_log->add_symsg( ).\n" " MESSAGE e008(zre7) WITH 'cx_ai_application_fault' l_exception_msg INTO lv_message.\n" " me->go_log->add_symsg( ).\n" " lcx->add_sy( ).\n" " RAISE EXCEPTION lcx.\n\n" " CATCH cx_root INTO exception_ref_root.\n" " l_exception_msg = exception_ref_root->get_longtext( ).\n" " WRITE: 'AI APP:', l_exception_msg.\n" " MESSAGE e007(zre7) INTO lv_message.\n" " me->go_log->add_symsg( ).\n" " MESSAGE e008(zre7) WITH 'cx_ai_application_fault' l_exception_msg INTO lv_message.\n" " me->go_log->add_symsg( ).\n" " lcx->add_sy( ).\n" " RAISE EXCEPTION lcx.\n\n" " ENDTRY.\n\n" " ENDMETHOD.\n\n\n" " METHOD fill_log_from_bapiret2.\n\n" " CALL METHOD me->go_log->add_from_bapi\n" " EXPORTING\n" " it_bapiret = bapi_return.\n\n" " ENDMETHOD.\n\n\n" " METHOD finish.\n\n" " CALL FUNCTION 'RECA_GUI_MSGLIST_POPUP'\n" " EXPORTING\n" " io_msglist = me->go_log\n" " if_popup = abap_false.\n\n" " me->go_log->store(\n" "* EXPORTING\n" "* if_in_update_task = ABAP_TRUE \" Call update program using \"IN UPDATE TASK\"\n" " EXCEPTIONS\n" " error = 1\n" " OTHERS = 2\n" " ).\n" " IF sy-subrc <> 0.\n" " MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno\n" " WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.\n" " ENDIF.\n" " COMMIT WORK.\n\n" " ENDMETHOD.\n\n\n" " METHOD gen_init_window_start_date.\n" " window_start_date = window_end_date.\n" " window_start_date+4 = '0101'.\n\n" " ENDMETHOD.\n\n\n" " METHOD gen_next_window_start_date.\n\n" "* DATA lv_last_update_ts TYPE tzntstmpl.\n\n\n" "** me->last_update_ts should already contain TS of the last update, but to be sure..\n" "* lv_last_update_ts = zcl_re7_storage_gateway=>get_last_meas_upd_ts( m_type = m_type ).\n" " IF NOT last_update_ts IS INITIAL.\n\n" " zcl_re7_storage_gateway=>get_window_dates_from_stas_tab(\n" " EXPORTING\n" " obj_type = obj_type\n" " last_update_ts = last_update_ts\n" " IMPORTING\n" " window_end_date = DATA(last_window_end_date)\n" " ).\n" " IF NOT last_window_end_date IS INITIAL.\n" " next_window_start_date = last_window_end_date + 1.\n" " ENDIF.\n" " IF next_window_start_date > sy-datum.\n" " next_window_start_date = sy-datum.\n" " ENDIF.\n" " ENDIF.\n" " ENDMETHOD.\n\n\n" " METHOD init_log.\n\n" " CALL METHOD cf_reca_message_list=>create\n" " EXPORTING\n" " id_object = 'ZRE7_IF'\n" " id_subobject = 'ZRE7_LN_MEAS_UPD'\n" " id_extnumber = 'RE Line Measures Update Log'\n" " RECEIVING\n" " ro_instance = go_log.\n\n" " ENDMETHOD.\n\n\n" " METHOD init_status_record.\n\n" " me->status_rec-timestamp = me->current_ts.\n" " me->status_rec-created_by_user = sy-uname.\n" " me->status_rec-is_line = me->is_line.\n" " me->status_rec-is_building = me->is_building.\n" " me->status_rec-is_property = me->is_property.\n" "* me->status_rec-processing_finished = abap_false.\n" " me->status_rec-window_start_date = me->window_start_date.\n" " me->status_rec-window_end_date = me->window_end_date.\n\n" " ENDMETHOD.\n\n\n" " METHOD main.\n" " DATA: lv_last_update_ts TYPE tzntstmpl,\n" " lv_message TYPE string.\n\n" "* me->display_buffor( me->buffer ).\n\n" " IF me->mode = 'download'.\n" " TRY.\n\n" " me->setup_new_window_dates( ).\n\n" " IF me->window_start_date > me->window_end_date.\n" " MESSAGE e013(zre7) INTO lv_message.\n" " me->go_log->add_symsg( ).\n" " me->finish( ).\n" " RETURN.\n" " ENDIF.\n\n" " me->init_status_record( ).\n" " me->download_data_to_buffer( ).\n\n" " CATCH zcx_re1_exception INTO DATA(lcx_download).\n" " me->finish( ).\n" " RETURN.\n" " ENDTRY.\n\n" " ELSEIF me->mode = 'buffer' OR me->mode = 'view'.\n" " me->status_rec = zcl_re7_storage_gateway=>read_sta_record( last_update_ts = me->last_update_ts obj_type = me->obj_type ).\n" " me->window_start_date = me->status_rec-window_start_date.\n" " me->window_end_date = me->status_rec-window_end_date.\n" " me->read_buffer( ).\n" " ENDIF.\n\n" "* >>> mark processing start in STA table - update entry with matching ts\n\n" " IF me->mode = 'buffer' OR me->mode = 'download'.\n" " me->process( ).\n\n" "* commit changes\n" "* display log\n" " me->finish( ).\n" " ELSEIF me->mode = 'view'.\n" " me->display_buffor( buffer = me->buffer ).\n" " ENDIF.\n" " ENDMETHOD.\n\n\n" " METHOD process.\n" " DATA:\n" " lv_validfrom TYPE recadatefrom,\n" " lv_validto TYPE recadateto,\n" " lt_buildings TYPE re_t_if_rebd_building\n" " ,\n" " lcx TYPE REF TO zcx_re1_exception,\n" " lt_processed LIKE me->buffer,\n" " lv_message TYPE string.\n\n" "* get all distinct municip_ids\n" "* loop at municip_ids\n" "* read all buff records with municip_id\n" "* loop at municip_id/sat_id\n" "* process building (update meas)\n" "* endloop\n" "* endloop\n\n" " MESSAGE s014(zre7) WITH me->window_start_date me->window_end_date INTO lv_message.\n" " me->go_log->add_symsg( ).\n\n\n" " DATA(lt_munic_ids) = me->buffer.\n" " SORT lt_munic_ids BY municip_id ASCENDING.\n" " DELETE ADJACENT DUPLICATES FROM lt_munic_ids COMPARING municip_id.\n\n\n" " me->calc_valid_period_for_building( IMPORTING valid_from = lv_validfrom valid_to = lv_validto ).\n\n" " LOOP AT lt_munic_ids ASSIGNING FIELD-SYMBOL(<fs_buffer_record>) .\n" " CLEAR lt_buildings.\n\n" " lt_buildings = zcl_re7_storage_gateway=>get_buildings_by_municip_key( municip_key = <fs_buffer_record>-municip_id go_log = me->go_log ).\n\n" " LOOP AT lt_buildings ASSIGNING FIELD-SYMBOL(<fs_building_obj>).\n" " IF zcl_re7_storage_gateway=>check_building_validity( building = <fs_building_obj> valid_from = lv_validfrom valid_to = lv_validto ) = abap_true.\n" " TRY.\n\n" " IF zcl_re7_storage_gateway=>is_building_assigned_to_sat( building_obj = <fs_building_obj> valid_from = lv_validfrom valid_to = lv_validto sat = <fs_buffer_record>-sat ) = abap_true.\n" " TRY.\n" "* TODO: refactor! pass whole record?\n" " me->process_building( building_obj = <fs_building_obj> value = <fs_buffer_record>-value_length unit = <fs_buffer_record>-unit_length ).\n" " APPEND <fs_buffer_record> TO lt_processed.\n\n" " CATCH zcx_re1_exception INTO lcx.\n" " me->fill_log_from_bapiret2( lcx->get_list( ) ).\n" " ENDTRY.\n" " ENDIF.\n\n" " CATCH zcx_re1_exception INTO lcx.\n" " me->go_log->add_from_exception(\n" " EXPORTING\n" " io_exception = lcx \" Global Exception Reference\n" "* if_cumulate = \" Cumulation of Messages\n" "* id_detlevel = \" Level of Detail (0..9)\n" "* id_probclass = \" Problem class\n" "* id_tabname = \" Table Name\n" "* id_fieldname = \" Field Name\n" "* id_value = \" Value\n" "* id_index = \" Line Index\n" "* id_intreno = \" INTRENO of Calling Program\n" "* id_context = \" Enhanced Navigation Data (Maximum 75 Characters)\n" " ).\n" " ENDTRY.\n" " ELSE.\n" " MESSAGE w003(zre7) WITH <fs_buffer_record>-sat <fs_buffer_record>-municip_id lv_validfrom lv_validto INTO lv_message.\n" " me->go_log->add_symsg( ).\n" " ENDIF.\n" " ENDLOOP.\n" " IF sy-subrc = 4 .\n" " MESSAGE w005(zre7) WITH <fs_buffer_record>-municip_id INTO lv_message.\n" " me->go_log->add_symsg( ).\n" " ENDIF.\n\n" " ENDLOOP.\n\n" " IF sy-subrc = 4 .\n" " MESSAGE s004(zre7) INTO lv_message.\n" " me->go_log->add_symsg( ).\n" " ENDIF.\n\n" " IF lt_processed IS NOT INITIAL.\n" " \" TODO: remember to enable after tests!\n" " me->clean_buffer( lt_processed ).\n" " ENDIF.\n\n" " IF lines( lt_processed ) <> lines( me->buffer ).\n" " MESSAGE w002(zre7) INTO lv_message.\n" " me->go_log->add_symsg( ).\n" " ENDIF.\n\n\n" "* >>> update status in STA table\n\n" " me->commit_changes( ).\n\n" " ENDMETHOD.\n\n\n" " METHOD process_building.\n" " DATA: lt_return TYPE TABLE OF bapiret2,\n" " lt_measurement TYPE TABLE OF bapi_re_measurement_datc,\n" " ls_meas_change LIKE LINE OF lt_measurement.\n" " DATA: lv_test_run TYPE abap_bool VALUE abap_false.\n\n" " DATA: bukrs TYPE bukrs,\n" " swenr TYPE swenr,\n" " sgenr TYPE sgenr\n" " ,\n" " lv_message TYPE string.\n\n" " FIELD-SYMBOLS <ls_meas> TYPE LINE OF re_t_rebd_meas.\n\n" "* check if line not deleted (look for measurement W0001 with value 0)\n" "* check if measurement exists (for validity period)\n" "* -> close measurement by setting valid_to = 31.12.YYYY (YYYY from me->window_end_date)\n" "* -> if valid_from > new_valid_to\n" "* -> report error\n" "*\n" "* insert new measurement: value = value, valid_from = 01.01.YYYY+1 (YYYY from me->window_end_date)\n\n\n" " me->calc_valid_period_for_building( IMPORTING valid_from = DATA(lv_validfrom) ).\n\n\n" " DATA(building_details) = building_obj->get_detail( ).\n" " bukrs = building_details-bukrs.\n" " swenr = building_details-swenr.\n" " sgenr = building_details-sgenr.\n\n" "* data(building_desc_key) = bukrs && '/' && swenr && '/' && sgenr.\n\n" " DATA(lo_meas_mngr) = building_obj->get_meas_mngr( ).\n\n" " \" get measurements for buildng\n" " CALL METHOD lo_meas_mngr->get_list\n" " EXPORTING\n" " if_fix_periods = abap_true\n" " IMPORTING\n" " et_list = DATA(lt_meas).\n\n" "* --------------------\n" "* processing..\n" "* --------------------\n\n" " \" check if deleted\n" " LOOP AT lt_meas ASSIGNING <ls_meas>\n" " WHERE meas = zcl_re7_upd_ctrl=>gc_deleted_m_type AND measvalue = zcl_re7_upd_ctrl=>gc_deleted_m_value.\n" " IF <ls_meas>-validfrom <= lv_validfrom AND <ls_meas>-validto >= lv_validfrom.\n" " MESSAGE w012(zre7) WITH bukrs && '/' && swenr && '/' && sgenr INTO lv_message.\n" " me->go_log->add_symsg( ).\n\n" " RETURN. \" building deleted, not to be processed\n\n" " ENDIF.\n" " ENDLOOP.\n\n" " \" look for existing, open or overlapping measurements, that need to be closed first\n" " LOOP AT lt_meas ASSIGNING <ls_meas>\n" " WHERE validto >= lv_validfrom\n" " AND meas = me->m_type.\n" " IF <ls_meas>-validfrom < lv_validfrom.\n" " CLEAR ls_meas_change.\n\n" " ls_meas_change-change_indicator = 'U'.\n" " ls_meas_change-measurement = <ls_meas>-meas.\n" " ls_meas_change-valid_from = <ls_meas>-validfrom.\n" " ls_meas_change-valid_to = lv_validfrom - 1.\n" " ls_meas_change-value_avail = <ls_meas>-measvalue.\n\n" " APPEND ls_meas_change TO lt_measurement.\n\n" " ENDIF.\n" " ENDLOOP.\n\n" "* insert new value\n" " CLEAR ls_meas_change.\n\n" " ls_meas_change-change_indicator = 'I'.\n" " ls_meas_change-measurement = me->m_type.\n" " ls_meas_change-valid_from = lv_validfrom.\n" " ls_meas_change-valid_to = zcl_re7_storage_gateway=>gc_max_date.\n" " ls_meas_change-value_avail = value.\n\n" " APPEND ls_meas_change TO lt_measurement.\n\n\n" "* Update measurements for building\n" " CALL FUNCTION 'BAPI_RE_BU_CHANGE'\n" " EXPORTING\n" " compcode = bukrs\n" " businessentitynumber = swenr\n" " buildingnumber = sgenr\n" " test_run = lv_test_run\n" " TABLES\n" " measurement = lt_measurement\n" " return = lt_return.\n\n" " IF lt_return IS NOT INITIAL.\n" " LOOP AT lt_return TRANSPORTING NO FIELDS\n" " WHERE type CA 'EAX'.\n" "* raise exception with bapiret\n" " DATA(lo_exception) = zcx_re1_exception=>create( ).\n" " lo_exception->add_bapiret(\n" " EXPORTING\n" " it_message = lt_return\n" " ).\n" " RAISE EXCEPTION lo_exception.\n" " ENDLOOP.\n" "* log success\n" " me->fill_log_from_bapiret2( lt_return ).\n" " ENDIF.\n\n" " ENDMETHOD.\n\n\n" " METHOD read_buffer.\n" " zcl_re7_storage_gateway=>read_buffer( EXPORTING m_type = me->m_type ts = me->last_update_ts CHANGING buffer = me->buffer ).\n" " ENDMETHOD.\n\n\n" " METHOD setup_new_window_dates.\n\n" " me->window_start_date = zcl_re7_upd_ctrl=>gen_next_window_start_date( obj_type = me->obj_type last_update_ts = me->last_update_ts ).\n" " IF me->window_start_date IS INITIAL.\n" " me->window_start_date = zcl_re7_upd_ctrl=>gen_init_window_start_date( window_end_date = me->window_end_date ).\n" " ENDIF.\n\n" " ENDMETHOD.\n\n\n" " METHOD store_data_in_buffer.\n" " me->buffer = zcl_re7_storage_gateway=>save_buffer(\n" " m_type = me->m_type\n" " ts = received_ts\n" " buffer = received_data\n" " window_start_date = window_start_date\n" " window_end_date = window_end_date\n" " ).\n" " ENDMETHOD.\n" "ENDCLASS.") matches = re.finditer(regex, test_str, re.IGNORECASE) for matchNum, match in enumerate(matches, start=1): print ("Match {matchNum} was found at {start}-{end}: {match}".format(matchNum = matchNum, start = match.start(), end = match.end(), match = match.group())) for groupNum in range(0, len(match.groups())): groupNum = groupNum + 1 print ("Group {groupNum} found at {start}-{end}: {group}".format(groupNum = groupNum, start = match.start(groupNum), end = match.end(groupNum), group = match.group(groupNum))) # Note: for Python 2.7 compatibility, use ur"" to prefix the regex and u"" to prefix the test string and substitution.

Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Python, please visit: https://docs.python.org/3/library/re.html