2015-06-11 80 views
0

毫無疑問,有一個更好的方法來做到這一點,但這是我的需求需要我這樣做的方式。正則表達式在文本中找到參數

我爲我的web應用程序創建了一個搜索表單。我想使用基於標記的搜索。所以我使用正則表達式來使它工作。

所以我有一個搜索字符串:'c:john customer:15478' 正則表達式需要找到標籤(c :)和參數(john),放下標籤並給我參數 - 它需要爲標籤的所有實例及其參數執行此操作。正則表達式我接近,但它不能正確工作。它不會抓住每個參數,也不會以一致的方式放置標籤。所以這個問題:爲了達到正確的結果,我的正則表達式需要修正哪些問題?

目前它找到第一個標籤,抓住它的參數,以及其後的所有其他東西。我需要它在找到一個參數後停止比賽。即在上面的情況下,它將匹配約翰客戶:15478

也許一個更好的問題是如何使VB的正則表達式返回第一個冒號和下一個標記(其後是另一個冒號)的開始之間的一切或否則停止匹配在下一個標籤的開始?

正則表達式:

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

{0}{1}表示使用字符串的String.format電話,說客戶(但它可以是任何東西),定義標籤。 {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 

但這仍依賴在分號上沒有標籤名稱

(所以不會墊如果你沒有傳遞字符串中的標籤名稱)

+0

這似乎很好地工作。它也簡單,簡短並且重要。我將不得不在VB中測試,但它應該工作。如果它有效,我會將其標記爲答案。 –