Regex найти аргументы в тексте

80
7

Там, несомненно, лучший способ сделать это, но это то, как мои требования требуют от меня этого.

Я создаю форму поиска для своего веб-приложения. Я хочу использовать тегированный поиск. Поэтому я использую регулярное выражение, чтобы заставить его работать.

Итак, у меня есть строка поиска: 'c: john customer: 15478' Регулярное выражение должно найти тег (c :) и аргумент (john), удалить тег и дать мне аргумент - и это нужно сделать для всех экземпляров тега и их аргументов. Регулярное выражение у меня близко, но оно работает неправильно. Он не захватывает каждый аргумент или не сбрасывает теги согласованным образом. Итак, вопрос: что не так с моим регулярным выражением, которое необходимо исправить для достижения правильных результатов?

В настоящее время он находит первый тег, захватывает свой аргумент и все остальное после него. Мне нужно, чтобы он остановил матч после того, как он нашел аргумент. т.е. в вышеприведенном случае он будет соответствовать клиенту john: 15478

Может быть, лучший вопрос: как заставить регулярное выражение VB возвращать все между первым двоеточием и началом следующего тега (за которым следует другой двоеточие) или иначе прекратить сопоставление в начале следующего тега?

Regex:

(?<=({0}({1})??:)+?)(\S+\s*\S*)(?=\s+?\b\w+:.+?)??

{0} и {1} представляют собой вызов String.format с использованием строки, например Customer (но это может быть что угодно), чтобы определить тег. {0} - первый символ, а {1} - остальные символы. Это регулярное выражение будет соответствовать всем, что существует за тегом, включая другой тег и его аргумент, если он существует. Итак, для строки

"c:5401 4664  c:john smith p:joam d:domain.com p:1548 c:215-548-5487 d:""192.168.0.1"""

Матчи будут

'5401 4664, john smith, 215-548-5487 d:"192.168.0.1"'
'domain.com p:1548, "192.168.0.1"'
'joam d:domain.com, 1548 c:215-548-5487'

учитывая теги, которые я определил. Регулярное выражение не может остановить его соответствие в начале следующего тега.

спросил(а) 2015-06-11T22:53:00+03:00 5 лет, 3 месяца назад
1
Решение
57

Если я правильно вас понял, это должно решить проблему в целом:

/\w+:([^:]+)(?:\s|$)/g

https://regex101.com/r/vN6fH1/1

и с определенным тегом он будет выглядеть так:

/{0}({1})?:([^:]+)(?:\s|$)/g

но это все еще зависит от точки с запятой, а не от имени тега

(так что он не будет совпадать вообще, если вы не передали имя тега, которое находится в строке)

ответил(а) 2015-06-12T17:37:00+03:00 5 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема