docs: @Override
      protected void compareData(ITable expectedTable, ITable actualTable, ComparisonColumn[] comparisonCols, FailureHandler failureHandler) throws DataSetException {
          logger.debug("compareData(expectedTable={}, actualTable={}, "
                          + "comparisonCols={}, failureHandler={}) - start",
                  new Object[]{expectedTable, actualTable, comparisonCols,
                          failureHandler});
  
          if (expectedTable == null) {
              throw new NullPointerException(
                      "The parameter 'expectedTable' must not be null");
          }
          if (actualTable == null) {
              throw new NullPointerException(
                      "The parameter 'actualTable' must not be null");
          }
          if (comparisonCols == null) {
              throw new NullPointerException(
                      "The parameter 'comparisonCols' must not be null");
          }
          if (failureHandler == null) {
              throw new NullPointerException(
                      "The parameter 'failureHandler' must not be null");
          }
  
          // iterate over all rows
          for (int i = 0; i < expectedTable.getRowCount(); i++) {
              // iterate over all columns of the current row
              for (int j = 0; j < comparisonCols.length; j++) {
                  ComparisonColumn compareColumn = comparisonCols[j];
  
                  String columnName = compareColumn.getColumnName();
                  DataType dataType = compareColumn.getDataType();
  
                  Object expectedValue = expectedTable.getValue(i, columnName);
                  Object actualValue = actualTable.getValue(i, columnName);
  
                  // Compare the values
                  if (skipCompare(columnName, expectedValue, actualValue)) {
                      if (logger.isTraceEnabled()) {
                          logger.trace("ignoring comparison " + expectedValue + "=" +
                                  actualValue + " on column " + columnName);
                      }
                      continue;
                  }
  
                  if(expectedValue != null && expectedValue.toString().startsWith("regex:")){
                      if(!regexMatches(expectedValue.toString(),actualValue.toString())){
                          Difference diff = new Difference(
                                  expectedTable, actualTable,
                                  i, columnName,
                                  expectedValue, actualValue);
  
                          // Handle the difference (throw error immediately or something else)
                          failureHandler.handle(diff);
                      }
                  }
                  else if (dataType.compare(expectedValue, actualValue) != 0) {
  
                      Difference diff = new Difference(
                              expectedTable, actualTable,
                              i, columnName,
                              expectedValue, actualValue);
  
                      // Handle the difference (throw error immediately or something else)
                      failureHandler.handle(diff);
                  }
              }
          }
      }