diff --git a/public/app/plugins/datasource/loki/query_utils.test.ts b/public/app/plugins/datasource/loki/query_utils.test.ts index c10d57a349b..c49e73cf7b3 100644 --- a/public/app/plugins/datasource/loki/query_utils.test.ts +++ b/public/app/plugins/datasource/loki/query_utils.test.ts @@ -92,4 +92,12 @@ describe('getHighlighterExpressionsFromQuery', () => { it('returns null if filter term is not wrapped in double quotes', () => { expect(getHighlighterExpressionsFromQuery('{foo="bar"} |= x')).toEqual(null); }); + + it('escapes filter term if regex filter operator is not used', () => { + expect(getHighlighterExpressionsFromQuery('{foo="bar"} |= "x[yz].w"')).toEqual(['x\\[yz\\]\\.w']); + }); + + it('does not escape filter term if regex filter operator is used', () => { + expect(getHighlighterExpressionsFromQuery('{foo="bar"} |~ "x[yz].w" |~ "z.+"')).toEqual(['x[yz].w', 'z.+']); + }); }); diff --git a/public/app/plugins/datasource/loki/query_utils.ts b/public/app/plugins/datasource/loki/query_utils.ts index 7fe32d6395e..cea7f220a2c 100644 --- a/public/app/plugins/datasource/loki/query_utils.ts +++ b/public/app/plugins/datasource/loki/query_utils.ts @@ -1,4 +1,5 @@ import { LokiExpression } from './types'; +import escapeRegExp from 'lodash/escapeRegExp'; const selectorRegexp = /(?:^|\s){[^{]*}/g; export function parseQuery(input: string): LokiExpression { @@ -45,6 +46,7 @@ export function getHighlighterExpressionsFromQuery(input: string): string[] { break; } // Drop terms for negative filters + const filterOperator = expression.substr(filterStart, 2); const skip = expression.substr(filterStart).search(/!=|!~/) === 0; expression = expression.substr(filterStart + 2); if (skip) { @@ -65,7 +67,8 @@ export function getHighlighterExpressionsFromQuery(input: string): string[] { if (quotedTerm) { const unwrappedFilterTerm = quotedTerm[1]; - results.push(unwrappedFilterTerm); + const regexOperator = filterOperator === '|~'; + results.push(regexOperator ? unwrappedFilterTerm : escapeRegExp(unwrappedFilterTerm)); } else { return null; }