2015-06-11 2 views
0

Существует, несомненно, лучший способ сделать это, но это то, как мои требования требуют от меня этого.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' 

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

+0

Вы пробовали: http://www.regexr.com/? – SQLMason

+0

да, и это основано на javascript. Это для приложения VB. –

ответ

1

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

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

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

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

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

, но это по-прежнему полагаться на точку с запятой не тег

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

+0

Это похоже работа замечательно. Это также просто, коротко и точно. Я должен буду тестировать vb, но он должен работать. Я буду отмечать это как ответ, если он работает. –

Смежные вопросы