2013-05-29 74 views
-1

我找不出正確的正則表達式我正在尋找。基本上我需要的是以下內容。RegEx與街道前綴和通配符

如果用戶搜索街道前綴(如N W E S)幷包含正則表達式忽略它的通配符(%,*)。我只希望正則表達式只與N W E S一起工作。

那麼我該如何編寫正則表達式來說,如果你旁邊有一個字符,那麼就忽略它。這是我迄今爲止所擁有的。

^(N | S | W | E)\ b

但它拿起N%等通配符......我不希望它太。

+0

你能舉一些你想要做什麼的例子嗎?你只是想匹配或捕捉?你的意思是用戶從字面上輸入「%」或「*」,或者說他們之後輸入了什麼? – Eli

回答

1

說明

此正則表達式僅匹配街道N,S,E,W,接着空格和多個文字或線的端部。

^([nsew])\b(?:\s.*?)?$

enter image description here

  • 0組將接收整個匹配的值
  • 組1將收到只是N,S,E,或W

    Ñ威斯康辛驅動 S Voter展位 E Kitten Ave 華盛頓街W Noghtington巷 銀石驅動 的Edans高速公路 Wireware Waythrough

你沒有指定語言,所以我選擇了PHP演示正則表達式。

<?php 
$sourcestring="N Wisconsin Drive 
S Voter Booth 
E Kitten Ave 
W Washington Street 
Noghtington Lane 
Silver Stone Drive 
Edans Expressway 
Wireware Waythrough"; 
    Dim re As Regex = New Regex("^([nsew])\b(?:\s.*?)?$",RegexOptions.IgnoreCase OR RegexOptions.Multiline) 
    Dim mc as MatchCollection = re.Matches(sourcestring) 
    Dim mIdx as Integer = 0 
    For each m as Match in mc 
     For groupIdx As Integer = 0 To m.Groups.Count - 1 
     Console.WriteLine("[{0}][{1}] = {2}", mIdx, re.GetGroupNames(groupIdx), m.Groups(groupIdx).Value) 
     Next 
     mIdx=mIdx+1 
    Next 
    End Sub 
End Module 

$matches Array: 
(
    [0] => Array 
     (
      [0] => N Wisconsin Drive 
      [1] => S Voter Booth 
      [2] => E Kitten Ave 
      [3] => W Washington Street 
     ) 

    [1] => Array 
     (
      [0] => N 
      [1] => S 
      [2] => E 
      [3] => W 
     ) 

) 
+0

非常感謝你! – devfunkd

+0

剛剛意識到它並不總是爲我工作,如果我輸入N%它可以工作...但是如果我輸入N Wisconsin Drive,它仍然會拾取整個街道名稱,但我希望的結果將只是N個字符。幫幫我? – devfunkd

+0

你是說你的示例文本包含像'N%oghtington Ave'這樣的值嗎?或者你說用戶提供的字符串需要首先清理,因爲用戶正在嘗試搜索'N%'並期望所有以'N'開始的值? –

0

^在這種情況下是字符串的開始而不是「不」。你可以用負面預測來做到這一點。

[NSWE](?!%|\*) 
0

從您的問題,它聽起來像你讓用戶輸入一個搜索表達式。然後,您試圖通過將其直接傳遞給正則表達式函數來對搜索項進行操作。

,如果用戶輸入N%希望尋找一個N隨後%任意數量的字符,但正則表達式引擎僅僅着眼於%字符,並試圖與之匹敵。您可以使用它作爲一個正則表達式之前更換%用下面的一個糾正用戶提供的搜索詞:

  • .*貪婪的比賽全部上線剩餘的字符
  • .*?非貪婪匹配任何數量人物
  • .匹配任何單個字符

同樣需要,如果用戶輸入一個*工作要做。

聲明:根據正則表達式函數.中使用的選項可能匹配或不匹配新行。根據您的用戶羣,最好告訴用戶搜索字詞需要遵循正則表達式語法。這將允許知識豐富的用戶建立自己的神祕表達。