Regex найти аргументы в тексте
Там, несомненно, лучший способ сделать это, но это то, как мои требования требуют от меня этого.
Я создаю форму поиска для своего веб-приложения. Я хочу использовать тегированный поиск. Поэтому я использую регулярное выражение, чтобы заставить его работать.
Итак, у меня есть строка поиска: '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'
учитывая теги, которые я определил. Регулярное выражение не может остановить его соответствие в начале следующего тега.
Если я правильно вас понял, это должно решить проблему в целом:
/\w+:([^:]+)(?:\s|$)/g
https://regex101.com/r/vN6fH1/1
и с определенным тегом он будет выглядеть так:
/{0}({1})?:([^:]+)(?:\s|$)/g
но это все еще зависит от точки с запятой, а не от имени тега
(так что он не будет совпадать вообще, если вы не передали имя тега, которое находится в строке)