Skip to content

Commit 3c91c62

Browse files
committedMar 5, 2023
[expressions][feature] Add ltrim/rtrim functions
Allows trimming spaces or other characters from just the start or end of strings
1 parent 12d6b44 commit 3c91c62

File tree

4 files changed

+92
-0
lines changed

4 files changed

+92
-0
lines changed
 

‎resources/function_help/json/ltrim

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"name": "ltrim",
3+
"type": "function",
4+
"groups": ["String"],
5+
"description": "Removes the longest string containing only the specified characters (a space by default) from the start of string.",
6+
"arguments": [{
7+
"arg": "string",
8+
"description": "string to trim"
9+
},
10+
{
11+
"arg": "characters",
12+
"description": "characters to trim",
13+
"optional": true,
14+
"default": "' '"
15+
}],
16+
"examples": [{
17+
"expression": "ltrim(' hello world ')",
18+
"returns": "'hello world '"
19+
},
20+
{
21+
"expression": "ltrim('zzzytest', 'xyz')",
22+
"returns": "'test'"
23+
}],
24+
"tags": ["removes", "leading", "whitespace", "spaces", "tabs"]
25+
}

‎resources/function_help/json/rtrim

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
{
2+
"name": "rtrim",
3+
"type": "function",
4+
"groups": ["String"],
5+
"description": "Removes the longest string containing only the specified characters (a space by default) from the end of string.",
6+
"arguments": [{
7+
"arg": "string",
8+
"description": "string to trim"
9+
},
10+
{
11+
"arg": "characters",
12+
"description": "characters to trim",
13+
"optional": true,
14+
"default": "' '"
15+
}],
16+
"examples": [{
17+
"expression": "rtrim(' hello world ')",
18+
"returns": "' hello world'"
19+
},
20+
{
21+
"expression": "rtrim('testxxzx', 'xyz')",
22+
"returns": "'test'"
23+
}],
24+
"tags": ["removes", "whitespace", "spaces", "tabs", "trailing"]
25+
}

‎src/core/expression/qgsexpressionfunction.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1342,6 +1342,28 @@ static QVariant fcnTrim( const QVariantList &values, const QgsExpressionContext
13421342
return QVariant( str.trimmed() );
13431343
}
13441344

1345+
static QVariant fcnLTrim( const QVariantList &values, const QgsExpressionContext *, QgsExpression *parent, const QgsExpressionNodeFunction * )
1346+
{
1347+
QString str = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1348+
1349+
const QString characters = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
1350+
1351+
const QRegularExpression re( QStringLiteral( "^([%1]*)" ).arg( QRegularExpression::escape( characters ) ) );
1352+
str.replace( re, QString() );
1353+
return QVariant( str );
1354+
}
1355+
1356+
static QVariant fcnRTrim( const QVariantList &values, const QgsExpressionContext *, QgsExpression *parent, const QgsExpressionNodeFunction * )
1357+
{
1358+
QString str = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
1359+
1360+
const QString characters = QgsExpressionUtils::getStringValue( values.at( 1 ), parent );
1361+
1362+
const QRegularExpression re( QStringLiteral( "([%1]*)$" ).arg( QRegularExpression::escape( characters ) ) );
1363+
str.replace( re, QString() );
1364+
return QVariant( str );
1365+
}
1366+
13451367
static QVariant fcnLevenshtein( const QVariantList &values, const QgsExpressionContext *, QgsExpression *parent, const QgsExpressionNodeFunction * )
13461368
{
13471369
QString string1 = QgsExpressionUtils::getStringValue( values.at( 0 ), parent );
@@ -8159,6 +8181,12 @@ const QList<QgsExpressionFunction *> &QgsExpression::Functions()
81598181
<< new QgsStaticExpressionFunction( QStringLiteral( "upper" ), QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( QStringLiteral( "string" ) ), fcnUpper, QStringLiteral( "String" ) )
81608182
<< new QgsStaticExpressionFunction( QStringLiteral( "title" ), QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( QStringLiteral( "string" ) ), fcnTitle, QStringLiteral( "String" ) )
81618183
<< new QgsStaticExpressionFunction( QStringLiteral( "trim" ), QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( QStringLiteral( "string" ) ), fcnTrim, QStringLiteral( "String" ) )
8184+
<< new QgsStaticExpressionFunction( QStringLiteral( "ltrim" ), QgsExpressionFunction::ParameterList()
8185+
<< QgsExpressionFunction::Parameter( QStringLiteral( "string" ) )
8186+
<< QgsExpressionFunction::Parameter( QStringLiteral( "characters" ), true, QStringLiteral( " " ) ), fcnLTrim, QStringLiteral( "String" ) )
8187+
<< new QgsStaticExpressionFunction( QStringLiteral( "rtrim" ), QgsExpressionFunction::ParameterList()
8188+
<< QgsExpressionFunction::Parameter( QStringLiteral( "string" ) )
8189+
<< QgsExpressionFunction::Parameter( QStringLiteral( "characters" ), true, QStringLiteral( " " ) ), fcnRTrim, QStringLiteral( "String" ) )
81628190
<< new QgsStaticExpressionFunction( QStringLiteral( "levenshtein" ), QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( QStringLiteral( "string1" ) ) << QgsExpressionFunction::Parameter( QStringLiteral( "string2" ) ), fcnLevenshtein, QStringLiteral( "Fuzzy Matching" ) )
81638191
<< new QgsStaticExpressionFunction( QStringLiteral( "longest_common_substring" ), QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( QStringLiteral( "string1" ) ) << QgsExpressionFunction::Parameter( QStringLiteral( "string2" ) ), fcnLCS, QStringLiteral( "Fuzzy Matching" ) )
81648192
<< new QgsStaticExpressionFunction( QStringLiteral( "hamming_distance" ), QgsExpressionFunction::ParameterList() << QgsExpressionFunction::Parameter( QStringLiteral( "string1" ) ) << QgsExpressionFunction::Parameter( QStringLiteral( "string2" ) ), fcnHamming, QStringLiteral( "Fuzzy Matching" ) )

‎tests/src/core/testqgsexpression.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1678,6 +1678,20 @@ class TestQgsExpression: public QObject
16781678
QTest::newRow( "title" ) << "title(' HeLlO WORLD ')" << false << QVariant( " Hello World " );
16791679
QTest::newRow( "trim" ) << "trim(' Test String ')" << false << QVariant( "Test String" );
16801680
QTest::newRow( "trim empty string" ) << "trim('')" << false << QVariant( "" );
1681+
QTest::newRow( "ltrim none" ) << "ltrim('trim ')" << false << QVariant( "trim " );
1682+
QTest::newRow( "ltrim space" ) << "ltrim(' trim ')" << false << QVariant( "trim " );
1683+
QTest::newRow( "ltrim empty string" ) << "ltrim('')" << false << QVariant( "" );
1684+
QTest::newRow( "ltrim('zzzytrim', 'xyz')" ) << "ltrim('zzzytrim', 'xyz')" << false << QVariant( "trim" );
1685+
QTest::newRow( "ltrim('zzzytrim', 'a')" ) << "ltrim('zzzytrim', 'a')" << false << QVariant( "zzzytrim" );
1686+
QTest::newRow( "ltrim('zzzytrim', '[(*')" ) << "ltrim('zzzytrim', '[(*')" << false << QVariant( "zzzytrim" );
1687+
QTest::newRow( "ltrim('))(* *[[trim', '[())* ')" ) << "ltrim('))(* *[[trim', '[())* ')" << false << QVariant( "trim" );
1688+
QTest::newRow( "rtrim none" ) << "rtrim(' trim')" << false << QVariant( " trim" );
1689+
QTest::newRow( "rtrim space" ) << "rtrim(' trim ')" << false << QVariant( " trim" );
1690+
QTest::newRow( "rtrim empty string" ) << "rtrim('')" << false << QVariant( "" );
1691+
QTest::newRow( "rtrim('trimzzzy', 'xyz')" ) << "rtrim('trimzzzy', 'xyz')" << false << QVariant( "trim" );
1692+
QTest::newRow( "rtrim('trimzzzy', 'a')" ) << "rtrim('trimzzzy', 'a')" << false << QVariant( "trimzzzy" );
1693+
QTest::newRow( "rtrim('trimzzzy', '[(*')" ) << "rtrim('trimzzzy', '[(*')" << false << QVariant( "trimzzzy" );
1694+
QTest::newRow( "rtrim('trim)(* *[[', '[()* ')" ) << "rtrim('trim)(* *[[', '[()* ')" << false << QVariant( "trim" );
16811695
QTest::newRow( "char" ) << "char(81)" << false << QVariant( "Q" );
16821696
QTest::newRow( "ascii single letter" ) << "ascii('Q')" << false << QVariant( 81 );
16831697
QTest::newRow( "ascii word" ) << "ascii('QGIS')" << false << QVariant( 81 );

0 commit comments

Comments
 (0)
Please sign in to comment.