diff --git a/public/app/plugins/datasource/loki/syntax.test.ts b/public/app/plugins/datasource/loki/syntax.test.ts
new file mode 100644
index 00000000000..7a5fcf18568
--- /dev/null
+++ b/public/app/plugins/datasource/loki/syntax.test.ts
@@ -0,0 +1,22 @@
+import syntax from './syntax';
+import Prism from 'prismjs';
+
+describe('Loki syntax', () => {
+ it('should highlight Loki query correctly', () => {
+ expect(Prism.highlight('{key="val#ue"}', syntax, 'loki')).toBe(
+ '{key="val#ue"}'
+ );
+ expect(Prism.highlight('{key="#value"}', syntax, 'loki')).toBe(
+ '{key="#value"}'
+ );
+ expect(Prism.highlight('{key="value#"}', syntax, 'loki')).toBe(
+ '{key="value#"}'
+ );
+ expect(Prism.highlight('#test{key="value"}', syntax, 'loki')).toBe(
+ ''
+ );
+ expect(Prism.highlight('{key="value"}#test', syntax, 'loki')).toBe(
+ '{key="value"}'
+ );
+ });
+});
diff --git a/public/app/plugins/datasource/loki/syntax.ts b/public/app/plugins/datasource/loki/syntax.ts
index f42c337eacc..fc2406479cf 100644
--- a/public/app/plugins/datasource/loki/syntax.ts
+++ b/public/app/plugins/datasource/loki/syntax.ts
@@ -69,8 +69,7 @@ export const FUNCTIONS = [...AGGREGATION_OPERATORS, ...RANGE_VEC_FUNCTIONS];
const tokenizer: Grammar = {
comment: {
- pattern: /(^|[^\n])#.*/,
- lookbehind: true,
+ pattern: /#.*/,
},
'context-aggregation': {
pattern: /((without|by)\s*)\([^)]*\)/, // by ()
@@ -85,11 +84,15 @@ const tokenizer: Grammar = {
},
'context-labels': {
pattern: /\{[^}]*(?=})/,
- lookbehind: true,
+ greedy: true,
inside: {
+ comment: {
+ pattern: /#.*/,
+ },
'label-key': {
pattern: /[a-z_]\w*(?=\s*(=|!=|=~|!~))/,
alias: 'attr-name',
+ greedy: true,
},
'label-value': {
pattern: /"(?:\\.|[^\\"])*"/,
diff --git a/public/app/plugins/datasource/prometheus/promql.test.ts b/public/app/plugins/datasource/prometheus/promql.test.ts
new file mode 100644
index 00000000000..2b0cc20fd1e
--- /dev/null
+++ b/public/app/plugins/datasource/prometheus/promql.test.ts
@@ -0,0 +1,22 @@
+import promql from './promql';
+import Prism from 'prismjs';
+
+describe('Loki syntax', () => {
+ it('should highlight Loki query correctly', () => {
+ expect(Prism.highlight('{key="val#ue"}', promql, 'promql')).toBe(
+ '{key="val#ue"}'
+ );
+ expect(Prism.highlight('{key="#value"}', promql, 'promql')).toBe(
+ '{key="#value"}'
+ );
+ expect(Prism.highlight('{key="value#"}', promql, 'promql')).toBe(
+ '{key="value#"}'
+ );
+ expect(Prism.highlight('#test{key="value"}', promql, 'promql')).toBe(
+ ''
+ );
+ expect(Prism.highlight('{key="value"}#test', promql, 'promql')).toBe(
+ '{key="value"}'
+ );
+ });
+});
diff --git a/public/app/plugins/datasource/prometheus/promql.ts b/public/app/plugins/datasource/prometheus/promql.ts
index 0bde2da9c2f..d4b68200ba6 100644
--- a/public/app/plugins/datasource/prometheus/promql.ts
+++ b/public/app/plugins/datasource/prometheus/promql.ts
@@ -377,8 +377,7 @@ export const FUNCTIONS = [
const tokenizer = {
comment: {
- pattern: /(^|[^\n])#.*/,
- lookbehind: true,
+ pattern: /#.*/,
},
'context-aggregation': {
pattern: /((by|without)\s*)\([^)]*\)/, // by ()
@@ -393,10 +392,15 @@ const tokenizer = {
},
'context-labels': {
pattern: /\{[^}]*(?=})/,
+ greedy: true,
inside: {
+ comment: {
+ pattern: /#.*/,
+ },
'label-key': {
pattern: /[a-z_]\w*(?=\s*(=|!=|=~|!~))/,
alias: 'attr-name',
+ greedy: true,
},
'label-value': {
pattern: /"(?:\\.|[^\\"])*"/,